我想知道'(1 . 2)
和'(1 2)
是否表示Scheme中相同的数据(彼此相等)?我认为它们是一回事,这是正确的吗?
答案 0 :(得分:28)
不,他们不一样。
'(1 . 2)
表示(cons 1 2)
,而
'(1 2)
表示(cons 1 (cons 2 nil))
答案 1 :(得分:3)
(1 . 2)
有时被称为不正确的列表,因为它不是NIL终止的。以点形式表示的(1 2)
可能会写为(1 2 . NIL)
,但您不应该写这样的内容。
答案 2 :(得分:2)
dr rackect解释得更清楚:
“对加入两个任意值..... 缺点过程构造对”
(cons 1 2)
'(1 . 2)
(pair? (cons 1 2))
#t
另一方面
“列表是创建链表的对的组合。更准确地说,列表是空列表null,或者是第一个元素是列表元素且第二个元素是列表的对。”
(cons 0 (cons 1 (cons 2 null)))
'(0 1 2)
http://docs.racket-lang.org/guide/pairs.html
请自50年代以来LISP一直在寻找准确的答案,看看他们的文件和示例他们周围60多年来有些人甚至没有出生在那里。
答案 3 :(得分:1)
是!
对: (cons y z)
在值y和z之间创建一对。同样,(更复杂的)表达式(cons x (cons y z))
在x和(y . z)
对之间创建一对。您还可以将这些对表示为'(y . z)
和'(x . (y . z))
列表:列表只是一种特殊类型的对。这是将值与已存在的列表配对的情况。由于第一个列表必须从某个地方开始,因此我们总是将空列表'()
(有时称为“空列表”)准备好配对。因此(cons y '())
将y与空列表配对,成为单项列表'(y)
。同样,(cons x '(y))
和(cons x (cons y '()))
将x与列表'(y)
配对,成为列表'(x y)
。
答案 4 :(得分:0)
列表必须以空列表结尾(也称为空)。下面的示例代码说明了不同之处。
> (cons 1 (cons 2 '())) ; I am a pair as well as list
'(1 2)
(pair? (cons 1 (cons 2 '())))
#t
> (list? (cons 1 (cons 2 '())))
#t
> (cons 1 (cons 2 3)) ;I am a pair but but not list
'(1 2 . 3)
> (pair? (cons 1 (cons 2 3)))
#t
> (list? (cons 1 (cons 2 3)))
#f