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))
?
(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))
,因为这将是一个包含两个元素,每个cons对的列表。我猜你意思是是:为什么不是((1 . 2) . (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试图使用s只要它可以显示列表符号 - 它只能回退到显式点击事物,一旦它到达一个没有配对或空列表的对象作为它的cdr
元素。
因此,在您的原始示例中,该缺点对的第二个元素是的一对,因此Scheme使用列表记法。这可以让它删除第二组圆括号和多余的点,得出你遇到的结果。