作者:Robin Lu | 来源:互联网 | 2023-05-22 19:45
(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> Alexis King..:
好吧,这不会是((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使用列表表示法.这使得它可以删除第二组括号和额外的点,从而产生您遇到的结果.