在以下方面有什么区别:
(cons 'a (cons 'b 'c)) ;; (A B . C)和
(cons 'a '(b.c)) ;; (A B.C)我需要使用cons创建下面的列表((a.b).c),所以我试图理解它是什么“。代表。
L.E.:我有以下的(cons (cons 'a 'b) 'c),但它产生的是((A . B) . C)而不是((A.B).C) (注意额外的空格)
发布于 2009-12-07 13:51:43
空格用于分隔列表标记。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)是正确的输出,你的代码是正确的答案。这是一个car指向另一个单元的单元格,cdr包含C。另一个单元是car包含A和cdr B的单元。
顺便说一句,列表是这类反单元格的线性链,因此汽车总是有一个值,cdr指向列表的其余部分。最后一个cdr没有指向任何地方(在Lisp中称为NIL )。在点表示法中,列表是例如(A . (B . (C . NIL)))。因为列表很重要,所以它们可以写得更短,比如:(A B C)。如果最后一个CDR有一个值而不是零,则用点表示法表示,例如(A . (B . (C . D))))可以写成(A B C . D)。
发布于 2009-12-07 13:38:13
两个字符之间的.是符号的一部分。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)创建一个反单元格,其中符号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)是一个反单元格,list (a.b)作为CAR,符号c作为CDR。
发布于 2009-12-07 13:40:50
如果这是在学习lisp的过程中,这个问题可能并不意味着一个隐含的“不允许空间”规则,因为空格对括号没有意义,正确的答案是您给出的答案。
特别是,在结束括号后的空格总是添加,但它只是为了人类可读性的目的。要求它不被印刷是毫无意义的。
https://stackoverflow.com/questions/1859505
复制相似问题