2010-10-09 67 views
28

從Lisp上閱讀的介紹材料,我現在考慮下面幾點是相同的:在Lisp(Clojure,Emacs Lisp)中,list和quote有什麼區別?

(list 1 2 3) 

'(1 2 3) 

然而,從我使用這兩個Clojure的和Emacs Lisp中引用的形式時面臨的問題來看,他們是的相同。你能告訴我有什麼不同嗎?

+0

他們退出類似的事實上看看我的問題[這裏](http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1#comment53680808_32927115) – William 2015-10-03 22:14:08

回答

9

引用列表(例如'(1 2 3))應該認真對待(一般爲只讀)。 (見答案When to use 'quote in LispWhen to use 'quote in Lisp)。

(list 1 2 3)將「建立一個新的名單,獨立於所有其他人。

您可以在manual for nconc中看到使用引用列表的一個缺陷示例。

而且,正如您可能知道的那樣,當您撥打'list時 - 顯然會將參數與引用列表的內容進行比較。而'quote只有一個參數,而'list是可變數量的參數。

(list (+ 1 2) 3)  --> (3 3) 
(quote ((+ 1 2) 3)) --> ((+ 1 2) 3) 
+1

我喜歡你指出他們的「簽名」,參數的數量之間的區別。 – 2012-07-26 18:40:11

8

在通用Lisp中,帶引號的對象是常量字面數據。你不應該修改這些數據,因爲後果是不確定的。可能的後果是:共享數據的修改,試圖修改只讀數據,錯誤可能會暗示,它可能只是工作,...

對於列表:

'(1 2 3) 

上面是一個常數列表,這將由讀者自行構建,因爲它被引用。如果它出現在Lisp代碼中,編譯器會以某種方式將這些數據嵌入到FASL代碼中。

(quote (1 2 3))是寫它的另一種方法。

(list 1 2 3) 

這是Common Lisp的功能LIST的三個參數123通話。評估結果是一個新的清單(1 2 3)

類似:

'(1 . 2) and (cons 1 2) 

'#(1 2 3) and (vector 1 2 3) 

一個是文字數據,而另一個是一個函數調用構成這種數據結構。

34

的主要區別在於quote防止元件的評價,而list 並不:

 
user=> '(1 2 (+ 1 2)) 
(1 2 (+ 1 2)) 
user=> (list 1 2 (+ 1 2)) 
(1 2 3) 

出於這個原因(除了別的以外),它是慣用的Clojure描述文字集合時使用的載體:

 
user=> [1 2 (+ 1 2)] 
[1 2 3] 
+0

這個答案看起來不誠實,因爲它沒有提到'(list 1 2'(+ 1 2))'仍然是一個列表,但是第三個元素沒有被評估,但是它並沒有表示''(1 2(+ 1 2))'和'(list'1'2'(+ 1 2))'' – Dmitry 2016-11-16 17:39:19