计划解释中的缺点

时间:2015-02-09 02:16:19

标签: scheme cons

(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 个答案:

答案 0 :(得分: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使用列表表示法。这样就可以删除第二组括号和额外的点,从而产生你遇到的结果。