【发布时间】: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