有什么区别:
(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)
(请注意额外的空格)
答案 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))
创建两个符号的列表a
和b.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单元格是一对“东西”(对象)。在您的情况下,这些东西是符号,它们被命名为A
,B
等。例如,此类单元格的打印表示为(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的过程中,这个问题可能并不意味着隐含的“不允许空格”规则,因为空格对括号没有重要意义,正确的答案是你给出的答案。
特别是,总是添加右括号后的空格,但它仅用于人类可读性目的。要求不打印是没有任何意义的。