2

我目前正在玩 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

4 回答 4

11

cons返回一个点对,不一定是一个列表。

(cons 1 2)返回(1 . 2)

(cons 1 null)返回(1)

(cons 1 (cons 2 null))返回(1 2)

于 2012-04-07T17:28:07.060 回答
4

A(cons 1 2)将返回一个对象,其第一个指针 ( car) 指向 1,另一个 ( cdr) 指向 2,这就是它以点对方式打印的原因。

此外,您可能想更深入地了解,我建议您阅读CL:对符号计算的温和介绍,“6.4. 比较 CONS、LIST 和 APPEND”,它很好地解释了这些主题。

于 2012-04-08T07:22:26.497 回答
2

试试 (cons 1 2) 返回什么。是清单吗?

于 2012-04-07T17:33:33.967 回答
1

致@ThomasUhrig:以下信息可能会对您有所帮助。

虽然我们在这里讨论的是 Lisp 语言,但我注意到一本名为“The Little Schemer (4th edition)”的著名书籍的第 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必须是一个列表。

结果是一个列表。

在实践中: ( cons AB) 适用于所有值 A 和 B,并且

汽车缺点AB))= A

( cdr (缺点AB)) = B

于 2013-05-25T13:22:05.027 回答