【问题标题】:List evaluation in LISP (strange behaviour of cons)LISP 中的列表评估(缺点的奇怪行为)
【发布时间】:2012-04-20 20:19:20
【问题描述】:

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

【问题讨论】:

  • 您似乎在使用 Racket 特有的一些非标准功能。在 Lisp(ANSI Common Lisp)中,列表以符号 nil 结束。在标准 Scheme(其中 Racket 显然是一种方言)中,列表不以符号结尾。它们由一个空列表对象终止,该对象写为()(在用作表达式时必须引用:'())。在 Scheme 中,您使用(null? x) 来测试x 是否为空列表,而不是(eq x null);没有预定义的null。在 Common Lisp 中,它是 (null x)(not x)(eq x nil)

标签: list lisp scheme racket cons


【解决方案1】:

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

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

(cons 1 null) 返回(1)

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

【讨论】:

  • 好的,谢谢。但是方式 (cons 1 (cons 2 null)) 不返回 (1 .(2))?
  • @Thomas:两个表达式代表相同的结构;约定是尽可能使用列表表示法而不是点对表示法。如果结构中的某些 cons 单元格的 cdr 是非空原子(如您的问题中所示),则需要点对表示法,因为该结构不是列表。
  • @ThomasUhrig This answer(免责声明:这是我的)有更多关于 cons 单元格的印刷表示。
【解决方案2】:

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

另外你可能想更深入地了解,我建议你阅读CL: gentle introduction to symbolic computation,“6.4.比较CONS、LIST和APPEND”,它很好地解释了这些主题。

【讨论】:

    【解决方案3】:

    试试 (cons 1 2) 返回的结果。是列表吗?

    【讨论】:

    • 显然不是。我想我错过了什么。谢谢。
    【解决方案4】:

    致@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)
    

    只需阅读“缺点法则”

    primitive cons 接受 2 个参数。

    cons 的第二个参数必须是一个列表。

    结果是一个列表。

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

    (汽车 (缺点 A B)) = A

    (cdr (cons A B)) = B

    【讨论】:

    • PDF 的链接不再起作用。我仍然可以通过 Google 轻松找到副本,但它似乎仍在某些地方出售;我不确定它是否应该免费分发。也就是说,相关的“缺点法则”可在 Google 图书preview 中找到。
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多