2015-11-27 82 views
0

在關閉,如果你運行下面的代碼:爲什麼在Clojure中使用conj的列表需要撇號?

(conj (1 2 3) 4) 

它會報錯,說:

ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn 

但是,如果列表之前放置一個撇號,它會運行正常

(conj '(1 2 3) 4) 

我的問題是,這個撇號究竟做了什麼,爲什麼它實際上需要這個列表?

我注意到,當您使用矢量

(conj [1 2 3] 4) 

其實這種情況不會發生,即使你使用一個撇號(conj '[1 2 3]),它仍然做工精細,並返回相同的結果。

撇號究竟做什麼,爲什麼列表需要它,但一個向量不? (道歉,如果這是一個初學者/愚蠢的問題,我仍然在學習。一個完整的答案,將不勝感激)

+0

[Clojure中'()和(list)有什麼區別?](http://stackoverflow.com/questions/10296857/whats-the-difference-between-and-list-in-clojure ) – cfrick

+0

嘗試''[1 2 x]'用'x'作爲變量,並且會有區別 – coredump

回答

2

有betweeen list(括號)和vector(括號內)有根本的區別,那名單用於函數調用,矢量只是矢量文字。

撇號是quote的讀者宏,它抑制了評估。例如,(+ 1 2)在從源文件讀入時被評估爲3,但'(+ 1 2)被讀入爲listclojure.lang.PersistentList,符合的思想代碼是在lisp中的數據。另一方面,引用矢量簡直就是vector本身。

所以你的情況,(conj (1 2 3) 4)讀的時候,它會嘗試調用名爲1帶參數23功能,難怪它會失敗。但是引用列表或矢量可以附加一個額外的元素。

相關問題