從Lisp上閱讀的介紹材料,我現在考慮下面幾點是相同的:在Lisp(Clojure,Emacs Lisp)中,list和quote有什麼區別?
(list 1 2 3)
'(1 2 3)
然而,從我使用這兩個Clojure的和Emacs Lisp中引用的形式時面臨的問題來看,他們是不的相同。你能告訴我有什麼不同嗎?
從Lisp上閱讀的介紹材料,我現在考慮下面幾點是相同的:在Lisp(Clojure,Emacs Lisp)中,list和quote有什麼區別?
(list 1 2 3)
'(1 2 3)
然而,從我使用這兩個Clojure的和Emacs Lisp中引用的形式時面臨的問題來看,他們是不的相同。你能告訴我有什麼不同嗎?
引用列表(例如'(1 2 3)
)應該認真對待(一般爲只讀)。 (見答案When to use 'quote in Lisp和When 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)
我喜歡你指出他們的「簽名」,參數的數量之間的區別。 – 2012-07-26 18:40:11
在通用Lisp中,帶引號的對象是常量字面數據。你不應該修改這些數據,因爲後果是不確定的。可能的後果是:共享數據的修改,試圖修改只讀數據,錯誤可能會暗示,它可能只是工作,...
對於列表:
'(1 2 3)
上面是一個常數列表,這將由讀者自行構建,因爲它被引用。如果它出現在Lisp代碼中,編譯器會以某種方式將這些數據嵌入到FASL代碼中。
(quote (1 2 3))
是寫它的另一種方法。
(list 1 2 3)
這是Common Lisp的功能LIST
的三個參數1
,2
和3
通話。評估結果是一個新的清單(1 2 3)
。
類似:
'(1 . 2) and (cons 1 2)
'#(1 2 3) and (vector 1 2 3)
一個是文字數據,而另一個是一個函數調用構成這種數據結構。
的主要區別在於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]
這個答案看起來不誠實,因爲它沒有提到'(list 1 2'(+ 1 2))'仍然是一個列表,但是第三個元素沒有被評估,但是它並沒有表示''(1 2(+ 1 2))'和'(list'1'2'(+ 1 2))'' – Dmitry 2016-11-16 17:39:19
他們退出類似的事實上看看我的問題[這裏](http://stackoverflow.com/questions/32927115/lisp-quote-work-internally?noredirect = 1#comment53680808_32927115) – William 2015-10-03 22:14:08