我目前正在玩LISP。一切都很好,但我无法理解以下问题。
我有这个追加操作:
(define (append l1 l2)
(if (eq? l1 null)
l2
(cons (first l1)
(myappend (rest l1) l2))))
我是这样使用它的:
(myappend (cons (cons 1 2) null) '(4 5))
球拍的结果是:
'((1 . 2) 4 5)
但是为什么?在我看来,它应该是'(1 2 4 5),因为 cons 返回一个列表,而 myappends 附加两个列表。有人可以帮助我吗?LISP 在做什么?
cons
返回一个虚线对,不一定是一个列表。
(cons 1 2)
返回(1 . 2)
(cons 1 null)
返回(1)
(cons 1 (cons 2 null))
返回(1 2)
(cons 1 2)
将返回一个对象,其第一个指针(car
)指向1,另一个指针(cdr
)指向2,这就是为什么它以点对方式打印的原因。
另外你可能想更深入地了解,我建议你阅读CL:符号计算的温和介绍,"6.4。比较缺点、列表和附加",很好地解释了这些主题。
试试 (缺点 1 2) 返回什么。这是一个列表吗?
@ThomasUhrig:以下信息可能会对您有所帮助。
虽然我们在这里谈论的是 Lisp 语言,但我注意到一本名为"小阴谋家(第 4 版)"的著名书籍第 8 页和第 9 页中的一句话帮助我完全理解了 2 个令人费解的事实:
Why (cons 1 2) does not look like '(1 2)?
Why (cons 1 '(2)) does look like '(1 2)?
----
> (cons 1 2)
(1 . 2)
> (cons 1 '(2))
(1 2)
> '(1 2)
(1 2)
只需阅读"缺点法则":
原始
cons
需要 2 个参数。要
cons
的第二个参数必须是列表。结果是一个列表。
在实践中:(缺点 A B) 适用于所有值 A 和 B,并且
(汽车(缺点 A B)) = A
(CDR (缺点 A B)) = B