Lisp之间的区别(cons'a(cons'b'c))和(cons'a'(b.c))

时间:2009-12-07 11:45:11

标签: lisp quote cons

有什么区别:

(cons 'a (cons 'b 'c)) ;; (A B . C)

(cons 'a '(b.c)) ;; (A B.C)

我需要创建以下列表((a.b).c)使用cons,所以我试图理解那个“。”表示。

L.E。:我有以下(cons (cons 'a 'b) 'c),但它会生成((A . B) . C)而不是((A.B).C)(请注意额外的空格)

3 个答案:

答案 0 :(得分:6)

两个字符之间的

.是符号的一部分。 b.c是一个名称为三个字符的符号: b c

如果输入FOO.BAR,则Lisp会将其读作一个符号。

如果输入(FOO.BAR),则Lisp会将其读作一个带有一个符号作为其内容的列表。

如果您输入(FOO . BAR),那么Lisp会将其作为一个利弊单元格读取,其中FOO CAR BAR CDR

.用于分隔cons小区的 CAR CDR (a . b)。请注意.周围的空格。

(cons 'b 'c)创建一个cons符号,其中符号b CAR ,符号c CDR 。它写成(b . c)

(cons 'a '(b.c))创建两个符号的列表ab.c。它写成(a b.c)

((A.B).C)始终打印为((A.B) . C)。它也不是一个列表。

((a.b) . c)是一个缺点单元格,其中列表(a.b) CAR ,符号c CDR 。< / p>

答案 1 :(得分:6)

空格用于分隔列表标记。 A.B是一个令牌。 (A.B)是包含单个元素的列表。 (A . B)是一个缺点单元格,其中A为car,B为cdr。

cons单元格是一对“东西”(对象)。在您的情况下,这些东西是符号,它们被命名为AB等。例如,此类单元格的打印表示为(A . B)。这称为“点符号”。第一个元素称为“car”,第二个元素称为“cdr”。

函数cons创建了这样一个单元格。 (cons 'a 'b)因此生成单元格(A . B)请注意,名称始终在内部升级

这很可能是您老师想要的,因此((A . B) . C)是正确的输出,而您的代码是正确答案。这是汽车指向另一个单元格的单元格,cdr包含C。另一个单元格是汽车包含A和cdr B的单元格。

顺便说一下, list 是这种cons单元的线性链,这样汽车总是保持一个值,而cdr指向列表的其余部分。最后一个cdr无处可寻(在Lisp中称为NIL)。在点表示法中,列表例如是(A . (B . (C . NIL)))。由于列表很重要,因此可以将它们写得更短:(A B C)。如果最后一个CDR具有值而不是NIL,则以点表示法显示,例如, (A . (B . (C . D))))可以写为(A B C . D)

答案 2 :(得分:1)

如果这是在学习lisp的过程中,这个问题可能并不意味着隐含的“不允许空格”规则,因为空格对括号没有重要意义,正确的答案是你给出的答案。

特别是,总是添加右括号后的空格,但它仅用于人类可读性目的。要求不打印是没有任何意义的。