3

有什么区别:

(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)(注意额外的空格)

4

3 回答 3

6

.两个字符之间是符号的一部分。b.c是一个名称为三个字符的符号:b , . ,和c

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

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

如果您输入,则 Lisp 会将其读取为(FOO . BAR)带有CARCDR的cons 单元格。FOOBAR

.用于分隔cons cell的CARCDR(a . b) : . 注意周围的空间.

(cons 'b 'c) 创建一个 cons 单元格,符号bCAR,符号cCDR。它写为(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,符号cCDR

于 2009-12-07T13:38:13.470 回答
6

空格用于分隔列表标记。 A.B是一个单一的令牌。 (A.B)是一个包含单个元素的列表。 (A . B)是一个带有Aas car 和Bas 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)

于 2009-12-07T13:51:43.003 回答
1

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

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

于 2009-12-07T13:40:50.977 回答