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



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

相关内容

  • 没有找到相关文章

最新更新