有什么区别:
(cons 'a (cons 'b 'c)) ;; (A B . C)
和
(cons 'a '(b.c)) ;; (A B.C)
我需要使用 cons 创建以下列表((ab).c),所以我试图了解那个“。” 代表。
LE:我有以下(cons (cons 'a 'b) 'c)
但它产生((A . B) . C)
而不是((A.B).C)
(注意额外的空格)
.
两个字符之间是符号的一部分。b.c
是一个名称为三个字符的符号:b , . ,和c。
如果您输入FOO.BAR
,则 Lisp 会将其作为一个符号读取。
如果您输入(FOO.BAR)
,则 Lisp 会将其读取为一个列表,其中一个符号作为其内容。
如果您输入,则 Lisp 会将其读取为(FOO . BAR)
带有CAR和CDR的cons 单元格。FOO
BAR
.
用于分隔cons cell的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)
是一个 cons 单元格,列表(a.b)
为CAR,符号c
为CDR。
空格用于分隔列表标记。 A.B
是一个单一的令牌。 (A.B)
是一个包含单个元素的列表。 (A . B)
是一个带有A
as car 和B
as cdr 的 cons 单元。
一个 cons 单元是一对“事物”(对象)。在您的情况下,这些东西是符号,它们被命名为A
,B
等。例如,这种单元格的打印表示是(A . B)
。这称为“点符号”。第一个元素称为“car”,第二个元素称为“cdr”。
该函数cons
创建这样一个单元格。 (cons 'a 'b)
从而产生细胞(A . B)
。 请注意,名称总是在内部大写。
这很可能是您的老师想要((A . B) . C)
的,正确的输出也是如此,您的代码也是正确的答案。这是汽车指向另一个单元格的单元格,并且 cdr 包含C
. 另一个单元格是 car 包含的单元格A
和 cdr B
。
顺便说一句,列表是这样的 cons 单元的线性链,因此 car 始终保存一个值,而 cdr 指向列表的其余部分。最后一个 cdr 不指向任何地方(在 Lisp 中称为 NIL)。在点表示法中,列表是 eg (A . (B . (C . NIL)))
。由于列表很重要,因此可以将它们写得更短,如下所示:(A B C)
. 如果最后一个 CDR 有一个值而不是 NIL,它以点表示法显示,例如(A . (B . (C . D))))
可以写为(A B C . D)
。
如果这是在学习 lisp 的过程中,那么这个问题可能并不意味着隐含的“不允许空格”规则,因为空格对括号并不重要,正确答案是你给出的答案。
特别是,总是添加右括号后的空格,但这仅用于人类可读性目的。要求它不被打印是没有任何意义的。