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

(cons';a(cons';b';c))和(cons';a';(b.c))之间的Lisp差异,lisp,quote,cons,Lisp,Quote,Cons,这两者之间的区别是什么: (cons 'a (cons 'b 'c)) ;; (A B . C) 及 我需要用cons创建下面的列表((a.b.c),所以我试图理解“.”代表什么 L.E.:我有以下(cons(cons'a'b)'c),但它产生((a.b.c),而不是((a.b.c)(注意额外的空格)两个字符之间是符号的一部分b.c是一个名称为三个字符的符号:b、、和c 如果输入FOO.BAR,Lisp将把它作为一个符号来读取 如果输入(FOO.BAR),Lisp将以列表的形式读取,其中一个符

这两者之间的区别是什么:

(cons 'a (cons 'b 'c)) ;; (A B . C)

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


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

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

如果输入
FOO.BAR
,Lisp将把它作为一个符号来读取

如果输入
(FOO.BAR)
,Lisp将以列表的形式读取,其中一个符号作为其内容

如果输入
(FOO.BAR)
,Lisp将把它作为cons单元格读取,其中
FOO
作为CAR,
BAR
作为CDR

用于分离cons单元的汽车和CDR:
(a.b)
。注意
周围的空格

(cons'b'c)
创建一个cons单元格,其中符号
b
作为车辆,符号
c
作为CDR。它写为
(b.c)

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

((A.B.C)
始终作为
((A.B.C)
打印。它也不是一个列表


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

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


特别是,总是在右括号后添加空格,但这只是为了便于阅读。要求不打印没有任何意义。

空格用于分隔列表标记<代码>A.B
是单个令牌<代码>(A.B)
是一个包含单个元素的列表
(A.B)
是一个cons单元,其中
A
作为car,
B
作为cdr

cons单元是一对“事物”(对象)。在您的例子中,这些东西是符号,它们被命名为
A
B
,等等。。例如,这种单元的打印表示是
(a.B)
。这称为“点表示法”。第一个元素称为“car”,第二个元素称为“cdr”

函数
cons
创建这样一个单元格<代码>(cons'a'b)
因此产生单元格
(a.b)
。请注意,名称在内部总是大写的

这很可能是您的老师想要的,因此
((A.B.C)
是正确的输出,而您的代码是正确的答案。这是一个单元,汽车指向另一个单元,cdr包含
C
。另一个单元是车辆包含
a
和cdr
B
的单元


顺便说一句,列表是这样一个cons单元格的线性链,这样汽车总是持有一个值,cdr指向列表的其余部分。最后一个cdr不指向任何地方(在Lisp中称为NIL)。在点表示法中,列表是例如
(a.(B.(C.NIL))
。因为列表很重要,所以可以这样写得更短:
(abc)
。如果最后一个CDR有一个值而不是NIL,它将以点表示法显示,例如
(a.(B.(C.D))
可以写成
(a B C.D)

a.B不是一个符号吗?我不这么认为。如果周围没有空格,则完全可以像操作符一样操作。不过,我有兴趣找到其他方法。
(cons 'a '(b.c)) ;; (A B.C)