【问题标题】:Split atoms into lists lisp将原子拆分为列表 lisp
【发布时间】:2016-03-07 06:40:36
【问题描述】:

如果我有一个原子,例如“a4”,我需要能够将 1 添加到“4”部分以使其成为 a5,但是因为它被认为是一个字符串,所以这是不可能的,所以如果我可以拆分 (a4 ) 到 ((a)(4)) 然后我可以对 4 进行计算,然后将它们重新组合在一起......

但是,我不确定如何将原子拆分为原子单词的列表?这可能吗?

编辑:我目前正在使用通用 lisp。我有一个字符串列表 (a3 d14 c2) 等,但我需要能够将它们中的每一个分开,将起始字母和后面的数字分开。

【问题讨论】:

  • 那你有什么?一个字符串?一个列表?你用的是什么“Lisp”?普通的 Lisp?方案?你尝试过什么?
  • 如前所述,这对于 LISP 来说是一个非常不寻常的事情:将字符串分成几个部分(是的,您可以使用 char 谓词),识别其中的一些部分形成一个像 14 这样的数字,将该子序列转换为整数,加 1,然后将其转换回并添加到其他部分。这真的是你在这里追求的吗?这是什么意思?可能有一种更像 LISP 的方式来做到这一点,不管它是什么。

标签: lisp


【解决方案1】:

这可以在 MACLISP 和 INTERLISP 中实现。转换列表中的符号的函数在 MACLISP 中称为“explode”,在 INTERLISP 中称为“unpack”;在 MACLISP 中将列表转换为符号的函数称为“implode”,在 INTERLISP 中称为“pack”。如果你的系统有一个 GENSYM 函数——一个创建符号的函数,因为符号被用作变量,所以必须动态创建它们,特别是在宏编程中——它可能具有类似于 'implode' 和 '爆炸”。

如果您使用的是 common lisp,这个 google 小组讨论提供了 'implode' 和 'explode' 的实现:https://groups.google.com/forum/#!topic/comp.lang.lisp/SXhf78kCI7Q

【讨论】:

    【解决方案2】:

    来自http://www.thefreedictionary.com/atom

    原子

    [..] 被认为是特定系统的不可约组成部分 [..]。 [..]

    我猜这个定义是 McCarthy 在命名 Lisp 原子时一直在想的。

    因此,您要实现的目标非常罕见,而不是在(普通或任何)Lisp 中通常如何工作。通常,您将单独的数据(例如令牌和数字)表示为两个不同的原子并将它们连接起来,例如使用 cons 单元格:

    (defvar *data* (cons "answer" 42))
    *data*
    ;; => ("answer" . 42)
    

    如果您希望将其打印为answer42,那么您必须打印它:

    (format t "~a~a" (car *data*) (cdr *data*))
    

    你想要的操作会是这样的:

    (defun inc-number (cell)
      "Please give me a better name and describe here what I do"
      (cons (car cell)
            (inc (cdr cell))))
    

    也就是说,当然可以实现你想要的:

    使用string,您可以获得符号的字符串表示,使用intern,您可以(在某种程度上)实现相反的效果。在这两者之间,您可以随意操作字符串,包括拆分、将其转换为数字等。

    【讨论】:

    • 在 Lisp 中,atom 的含义是 (not cons)。这包括许多可以分解的数据类型...符号名称也很常见,其中包括数字,向上计数:dog1、dog2、dog3... 分解原子的操作传统上称为 EXPLODE反之则称为 IMPLODE。请参阅 Lisp 常见问题解答:cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/part2/faq-doc-3.html
    • @RainerJoswig 我知道,虽然在最小的 Lisp 中,一个单一的数据类型(符号)就足够了,据我所知(如果我错了,请纠正我)原来的(想法of) Lisp 只有符号。因此,更好的名称将是“自我评估项目”IMO。我发现在我的回答中存在混淆原子和符号的危险,而且我还猜想 OP 实际上是指符号而不是原子。我会尝试解决这个问题。至于操作符号的代码:IMO 这应该只发生在元级别,即在某些宏中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多