我知道在Lisp的名單必須以零結束,但表達類似列表不無Lisp的
(print (cons 1 (cons 3 2)))
不會引發任何錯誤。它打印:
(1 3 . 2)
它是正確的嗎?
我正在使用GNU Clisp。
我知道在Lisp的名單必須以零結束,但表達類似列表不無Lisp的
(print (cons 1 (cons 3 2)))
不會引發任何錯誤。它打印:
(1 3 . 2)
它是正確的嗎?
我正在使用GNU Clisp。
你有什麼是dotted list,這是一種improper list。
其中最後一個CDR爲NIL的CONS單元鏈是。
當你遍歷一個列表時,當你打到零時,你知道你達到了最後。 你有一輛車和一個點對的列表。
在Lisp,一個適當清單,NIL
結束,但你也有不當名單。一種不正確的清單是最後一個反用細胞在其CDR
中具有除NIL
之外的原子的清單。 (1 3 . 2)
就是這樣一個不正確的列表。
你甚至可以在沒有最後一個單元的地方使用不正確的列表。 CAR
s和CDR
s基本上只是指針,所以你可以有圓形的列表!
在Common Lisp(這是CLISP實現的語言)中,許多標準函數不適用於不適當的列表作爲參數。
這也是有趣的是正確評估列表時,會發生什麼:
;; 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
它忽略了終端原子。
謝謝。有趣的音符。 –