在 SICP 练习 2.26 中,给出了该方案代码:
(define x (list 1 2 3))
(define y (list 4 5 6))
然后给出这个 cons 调用:
(cons x y)
我预计会产生一对列表,((1 2 3) (4 5 6))
但翻译给出,((1 2 3) 4 5 6)
...包含 4 个元素的列表,第一个是列表。为什么 y 受到不同对待?我尝试查找其他 SICP 答案以获取解释,但找不到令人满意的内容。那么,是否有任何计划/Lisp 专家可以阐明这方面的缺点?预先感谢您的任何见解。
'((1 2 3) 4 5 6)
实际上是一对列表。这是另一种写法:
'((1 2 3) . (4 5 6))
但是,打印机会尽可能避免点对符号,因此您会得到第一个表示形式。规则是:
'(x . (xs ...))
=>
'(x xs ...)
For any x
and xs
。在这里,你的x = '(1 2 3)
and xs = '(4 5 6)
,所以你得到((1 2 3) 4 5 6)
.
要了解 cons 和点对符号如何相关,让我们将问题简化为'(1)
and '(6)
。构建它们的最低级方法是这样的:
(cons (cons 1 '()) (cons 6 '()))
Here, '()
为零,或空列表。如果我们将其字面翻译为点对符号,我们会得到:
'((1 . ()) . (6 . ()))
但由于打印机会尽可能折叠点对符号,因此您会得到以下结果:
'((1 . ()) . (6 . ()))
=>
'((1) . (6)) ; <-- x=1, xs=nothing; x=6, xs=nothing
=>
'((1) 6) ; <-- x=1, xs=6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)