Scheme中的配对和列表是否不同?

时间:2011-05-15 05:27:17

标签: scheme

我想知道'(1 . 2)'(1 2)是否表示Scheme中相同的数据(彼此相等)?我认为它们是一回事,这是正确的吗?

5 个答案:

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