我目前正在玩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))
Racket的结果是:
'((1 . 2) 4 5)
但为什么呢?在我的意见中,它应该是'(1 2 4 5),因为cons返回一个列表,myappends附加两个列表。有谁能够帮我? LISP在做什么?
答案 0 :(得分:11)
cons
返回一个虚线对,不一定是列表。
(cons 1 2)
返回(1 . 2)
(cons 1 null)
返回(1)
(cons 1 (cons 2 null))
返回(1 2)
答案 1 :(得分:4)
(cons 1 2)
将返回一个对象,其第一个指针(car
)指向1,而另一个指针(cdr
)指向2,这就是为什么它在点上打印的原因 - 对时尚。
此外,您可能希望更深入地了解,我建议您阅读CL: gentle introduction to symbolic computation,“6.4。比较CONS,LIST和APPEND”,这些内容非常好地解释了这些主题。
答案 2 :(得分:2)
尝试什么(缺点1 2)返回。这是一个清单吗?
答案 3 :(得分:1)
to @ThomasUhrig:以下信息可能会对您有所帮助。
虽然我们在这里谈论Lisp语言,但我注意到一本名为"The Little Schemer (4th edition)"的着名书籍的 Page 8和9 中的一行帮助我完全理解了两个令人费解的事实:
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
的第二个参数必须是一个列表。结果是一个列表。
在实践中:(缺点 AB)适用于 所有值A和B ,以及
(汽车(缺点 A B))= A
( cdr (缺点 A B))= B