我目前正在玩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))
而且結果Racket是:
'((1 . 2) 4 5)
但是,爲什麼?在我看來,它應該是'(1 2 4 5),因爲cons返回一個列表,並且我的發現附加了兩個列表。有誰能夠幫助我? LISP在做什麼?
您似乎在使用某些Racket特有的非標準功能。在Lisp(ANSI Common Lisp)列表中以符號'nil'終止。在標準方案中(其中球拍顯然是一種方言),列表不會以符號結尾。它們由寫入'()'的空列表對象終止,並且在作爲表達式使用時必須引用''()')。在Scheme中使用'(null?x)'來測試'x'是否是空列表,而不是'(eq x null)';沒有預定義的'null'。在Common Lisp中,它是'(null x)'或'(不是x)'或'(eq x nil)'。 – Kaz 2012-04-09 19:27:36