首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(cons 'a (cons 'b‘c)和(cons 'a '(b.c))之间的Lisp差异

(cons 'a (cons 'b‘c)和(cons 'a '(b.c))之间的Lisp差异
EN

Stack Overflow用户
提问于 2009-12-07 11:45:10
回答 3查看 2.6K关注 0票数 3

在以下方面有什么区别:

代码语言:javascript
复制
(cons 'a (cons 'b 'c)) ;; (A B . C)

代码语言:javascript
复制
(cons 'a '(b.c)) ;; (A B.C)

我需要使用cons创建下面的列表((a.b).c),所以我试图理解它是什么“。代表。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-07 13:51:43

空格用于分隔列表标记。A.B是一个单一的令牌。(A.B)是一个具有单个元素的列表。(A . B)是以A为car,B为cdr的cons单元。

反单元格是一对“事物”(对象)。在你的例子中,这些东西是符号,它们被命名为AB等等。例如,这样一个单元格的打印表示形式是(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)

票数 6
EN

Stack Overflow用户

发布于 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))创建一个包含两个符号的列表,ab.c。它被写成(a b.c)

((A.B).C)总是以((A.B) . C)的形式打印。这也不是一个清单。

((a.b) . c)是一个反单元格,list (a.b)作为CAR,符号c作为CDR。

票数 6
EN

Stack Overflow用户

发布于 2009-12-07 13:40:50

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

特别是,在结束括号后的空格总是添加,但它只是为了人类可读性的目的。要求它不被印刷是毫无意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1859505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档