为什么使用cons()和list()创建的列表显示不同,尽管列表相同?第一个显示用点分隔的项目,但第二个用w / o分隔。
> (cons 1 2)
(1 . 2)
> '(1 2)
(1 2)
我知道cons
构造了虚线对,但在这种情况下,列表相同,但显示方式不同。
答案 0 :(得分:8)
不一样的列表;一个列表,如
(1 2)
由引用(即第二)表达式返回的与
的结果相同 (cons 1 (cons 2 ())
像上面这样的正确列表总是一对单链表,其最后一对没有尾部。
答案 1 :(得分:5)
扩展Basile的答案:
(1 2)
是长度为2的正确列表。也就是说,它包含两个缺点:
#1=(1 . #2#)
#2=(2 . ())
另一方面,
(1 . 2)
是长度为1的不当列表。也就是说,它包含一个cons单元格:
#1=(1 . 2)
非空正确列表是包含空列表cdr
的最后一个cons单元格()
的列表。非空的不正确列表是最后一个cons单元格cdr
包含其他内容的列表。
答案 2 :(得分:0)
让我进一步扩展以前的答案
虽然我们在这里谈论Lisp语言,但我注意到一本名为"The Little Schemer (4th edition)"的着名书籍的 Page 8和9 中的一行帮助我完全理解了两个令人费解的事实:
Why is (cons 1 2) does not look like '(1 2)?
Why is (cons 1 '(2)) does look like '(1 2)?
----
> (cons 1 2)
(1 . 2)
> (cons 1 '(2))
(1 2)
> '(1 2)
(1 2)
请阅读“缺点法则”:
原语
cons
需要2个参数。
cons
的第二个参数必须是一个列表。结果是一个列表。
在实践中:(缺点 AB)适用于 所有值A和B ,以及
(汽车(缺点 A B))= A
( cdr (缺点 A B))= B