2015-02-09 72 views
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))

回答

5

那么,它不会是((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使用列表记法。这可以让它删除第二组圆括号和多余的点,得出你遇到的结果。