2012-04-07 60 views
2

我目前正在玩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在做什麼?

+3

您似乎在使用某些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

回答

11

cons返回一個虛線對,不一定是一個列表。

(cons 1 2)回報(1 . 2)

(cons 1 null)回報(1)

(cons 1 (cons 2 null))回報(1 2)

+0

好的,謝謝。但是方式(cons 1(cons 2 null))不返回(1.(2))? – 2012-04-07 17:37:57

+4

@Thomas:這兩個表達式表示相同的結構;該慣例是儘可能優先使用列表符號而不是虛線對符號。如果結構中的某個cons單元格有一個非空原子的cdr(如您的問題所示),則由於該結構不是列表,因此將需要虛線對符號。 – 2012-04-07 17:47:02

+0

@ThomasUhrig [這個答案](http://stackoverflow.com/a/16379759/1281433)(免責聲明:它是我的)有更多關於cons單元格的打印表示。 – 2013-10-14 15:31:24

2

嘗試什麼(1利弊2)回報。這是一個列表嗎?

+0

顯然不是。我想我錯過了一些東西。感謝名單。 – 2012-04-07 17:36:17

4

A (cons 1 2)將返回一個對象的第一個指針(car)指向1,另一個(cdr)指向2,這就是爲什麼它以點對方式打印的原因。

另外你也許想深入瞭解一下,我會推薦你​​閱讀CL: gentle introduction to symbolic computation,「6.4。比較CONS,LIST和APPEND」,這很好地解釋了這些話題。

+0

不錯的書,謝謝。 – 2012-04-08 08:12:56

1

to @ThomasUhrig:以下信息可能對您有所幫助。

雖然我們在這裏討論的Lisp語言,我注意到,從第8頁和著名書9線命名"The Little Schemer (4th edition)"幫助我完全理解的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必須是一個列表。

結果是一個列表。

在實踐中:缺點 AB)適用於所有值A和B

缺點 AB))= A

cdr缺點 A B))= B

+1

到PDF的鏈接不再有效。我仍然可以很容易地找到Google的副本,但似乎仍然在地方出售;我不確定它是否應該自由分發。也就是說,相關的「缺點法」可以在Google圖書[預覽]中找到(http://books.google.com/books?id=xyO-KLexVnMC&lpg=PA9&dq=little%20schemer%20%22law%20of% 20cons%22&PG = PA9#v = onepage&q =小%20schemer%20%22law%20of%20cons%22&F = FALSE)。 – 2013-12-14 20:39:45