为什么使用cons()和list()创建的列表的显示方式不同?

时间:2011-11-17 07:09:50

标签: list lisp

为什么使用cons()和list()创建的列表显示不同,尽管列表相同?第一个显示用点分隔的项目,但第二个用w / o分隔。

> (cons 1 2)
(1 . 2)

> '(1 2)
(1 2)

我知道cons构造了虚线对,但在这种情况下,列表相同,但显示方式不同。

3 个答案:

答案 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