2010-03-04 74 views
7

我知道在Lisp的名單必須以零結束,但表達類似列表不無Lisp的

(print (cons 1 (cons 3 2))) 

不會引發任何錯誤。它打印:

(1 3 . 2) 

它是正確的嗎?

我正在使用GNU Clisp。

回答

-1

當你遍歷一個列表時,當你打到零時,你知道你達到了最後。 你有一輛車和一個點對的列表。

11

在Lisp,一個適當清單,NIL結束,但你也有不當名單。一種不正確的清單是最後一個反用細胞在其CDR中具有除NIL之外的原子的清單。 (1 3 . 2)就是這樣一個不正確的列表。

你甚至可以在沒有最後一個單元的地方使用不正確的列表。 CAR s和CDR s基本上只是指針,所以你可以有圓形的列表!

在Common Lisp(這是CLISP實現的語言)中,許多標準函數不適用於不適當的列表作爲參數。

3

這也是有趣的是正確評估列表時,會發生什麼:

;; A proper list 
(cons '+ (cons 5 (cons 10 '()))) 
⇒ (+ 5 10) 
(eval (+ 5 10)) 
⇒ 15 

與評估點列表:

;; A dotted list 
(cons '+ (cons 5 (cons 10 5000))) 
⇒ (+ 5 10 . 5000) 
(eval (+ 5 10 . 5000)) 
⇒ 15 

它忽略了終端原子。

+0

謝謝。有趣的音符。 –