LISP中的列表评估(缺点的奇怪行为)

时间:2012-04-07 17:20:43

标签: list lisp scheme racket cons

我目前正在玩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在做什么?

4 个答案:

答案 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