2

(cons 1 2)给我们(1 . 2)

(cons 3 4)给我们(3 . 4)

那么为什么(cons (cons 1 2) (cons 3 4))给我们((1 . 2) 3 . 4)呢?为什么不是((1 . 2) (3 . 4))

4

1 回答 1

5

好吧,这不会是((1 . 2) (3 . 4))因为那将是一个包含两个元素的列表,每个元素都是一个缺点对。我猜你的意思是:为什么不是((1 . 2) . (3 . 4))

好吧,实际上以下两个表达式是等价的:

'((1 . 2) . (3 . 4))
'((1 . 2) 3 . 4)

这与 Scheme 的点符号如何与其正确列表的表示一起工作有关。请记住:

'(1 . (2 . (3 . (4 . ()))))

...将简单地打印为:

(1 2 3 4)

然而,这:

'(1 . (2 . (3 . 4)))

...将像这样打印:

(1 2 3 . 4)

请注意,Scheme 尽可能地尝试使用简化的列表表示法——它只有在到达没有配对或空列表作为其cdr元素的配对时才回退到显式点点事物。

因此,在您的原始示例中,该 cons 对的第二个元素一对,因此 Scheme 使用列表表示法。这让它删除第二组括号和多余的点,产生你遇到的结果。

于 2015-02-09T02:25:14.693 回答