我想知道在Scheme中'(1 . 2)
和'(1 2)
是否表示相同的数据(相互等同)? 我认为它们是相同的东西,这正确吗?
我想知道在Scheme中'(1 . 2)
和'(1 2)
是否表示相同的数据(相互等同)? 我认为它们是相同的东西,这正确吗?
不,它们不一样。
'(1 . 2)
表示 (cons 1 2)
而
'(1 2)
表示 (cons 1 (cons 2 nil))
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多年,有些人甚至还没有出生。
(1 . 2)
有时被称为不完整列表,因为它没有以NIL结尾。(1 2)
用点号表示可以写成(1 2 . NIL)
,但是您不应该这样写。
是的!
对: (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)
。
> (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