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

dan*_*els 3 lisp cons quote

有什么区别:

(cons 'a (cons 'b 'c)) ;; (A B . C)
Run Code Online (Sandbox Code Playgroud)

(cons 'a '(b.c)) ;; (A B.C)
Run Code Online (Sandbox Code Playgroud)

我需要使用cons创建以下列表((ab).c),所以我试图理解那个"." 代表.

LE:我有以下(cons (cons 'a 'b) 'c)但它产生((A . B) . C)而不是((A.B).C)(注意额外的空格)

Rai*_*wig 6

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

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

如果你输入(FOO.BAR)那么Lisp将把它读作一个列表,其中一个符号作为其内容.

如果您输入(FOO . BAR)然后Lisp的将它读成一个利弊细胞FOO作为CARBAR作为CDR.

.用于分离CAR和cons细胞的CDR : (a . b). 注意周围的空间..

(cons 'b 'c) 创建一个cons符号,其符号bCAR,符号cCDR.它写成(b . c).

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

((A.B).C)始终打印为((A.B) . C).它也不是一个清单.

((a.b) . c)是一个缺点单元,列表(a.b)CAR,符号cCDR.


Sva*_*nte 6

空格用于分隔列表标记. A.B是一个单一的标记. (A.B)是一个包含单个元素的列表. (A . B)是一个有A汽车和Bcdr 的利弊细胞.

cons单元格是一对"东西"(对象).在你的情况下,这些东西是符号,它们被命名为A,B等等.这样的细胞的印刷表示是(A . B),例如.这称为"点符号".第一个元素称为"car",第二个元素称为"cdr".

该函数cons创建了这样一个单元格. (cons 'a 'b)从而产生细胞(A . B). 请注意,名称始终在内部升级.

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

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