(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))
?
好吧,它不会((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
元素的对时才回退到显式点状
在您的原始示例中,该缺点对的第二个元素是一对,因此 Scheme 使用列表表示法。这让它去掉第二组括号和额外的点,产生你遇到的结果。