(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
和cdrB
的单元
顺便说一句,列表是这样一个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)