在Scheme中,pair和list有什么不同?

24

我想知道在Scheme中'(1 . 2)'(1 2)是否表示相同的数据(相互等同)? 我认为它们是相同的东西,这正确吗?


2
所有的列表都是一对,但并非所有的一对都是列表。 - sevko
5个回答

34

不,它们不一样。

'(1 . 2) 表示 (cons 1 2)

'(1 2) 表示 (cons 1 (cons 2 nil))


1
谢谢。我现在明白了。列表(1 2)实际上应该等于点对(1 .(2))。 - Thomson
5
这也等同于 (1 . (2 . ()))。 - erjiang

4

Dr.Racket更清楚地解释了它:

Pair连接两个任意值......Cons过程构造对。”

(cons 1 2)
'(1 . 2)

(pair? (cons 1 2))
#t

另一方面,“列表”是由成对的元素组成的链表。更确切地说,一个列表要么是空列表null,要么是一个成对的元素,其第一个元素是列表元素,第二个元素是列表。

on the other hand

另一方面
 (cons 0 (cons 1 (cons 2 null)))
'(0 1 2)

http://docs.racket-lang.org/guide/pairs.html

请注意,LISP语言自上世纪50年代以来已经存在了很长时间。如果您需要准确的答案,请查看他们的文档和示例。这些资源已经存在了60多年,有些人甚至还没有出生。


你也可以“创建”列表 '(x y z) (cons 'x (cons 'y (cons 'z '()))) (list 'x 'y 'z) - Guglielmo Guglielmi

3

(1 . 2)有时被称为不完整列表,因为它没有以NIL结尾。(1 2)用点号表示可以写成(1 2 . NIL),但是您不应该这样写。


2

是的!

对: (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)

的英译中文为:


0
列表必须以空列表结尾(也称为空)。下面的示例代码在repl上说明了差异。
> (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   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接