2014-01-23 23 views
5

其實我想完全理解Clojure的特別符號用Clojure語言什麼<'a>真的是

(def a 1) 
(type a) 
;;=>java.lang.Long 
(type 'a) 
;;=>clojure.lang.Symbol 

我知道type是一個功能,所以它的參數會首先評估,所以我完全理解爲什麼上述工作的代碼這種方式。在流動的代碼,我決定用宏

(defmacro m-type [x] (type x)) 
(m-type a) 
;;==>clojure.lang.Symbol 

延遲評估和我很好,與但我不能uderstand是這樣的:

(m-type 'a) 
;;=>clojure.lang.Cons 

爲什麼類型「a是缺點

+1

用戶誰投票決定關閉「太寬」你能證明你的決定?這有一個具體和簡單的答案 – jozefg

+0

也許有人只讀標題? –

回答

6

字符」由Clojure的讀取器解釋爲一個讀取器 - 宏它將擴展爲包含隨後任何遵循」符號quote列表,所以在您的來電(m-type 'a)'a正在擴大:

user> (macroexpand-1 ''a) 
(quote a) 

然後調用類型列表(quote a)這是一個缺點上。

這可能是有點更清楚,如果我們做M型宏打印參數,因爲它看到他們,而它正在評估:

user> (defmacro m-type [x] (println "x is " x) (type x)) 
#'user/m-type 
user> (m-type 'a) 
x is (quote a) 
clojure.lang.Cons 
+1

我認爲OP仍然會被(類型'a)的結果所困惑 - 沒有宏的呼叫 - – Chiron

+1

這是一個很好的觀點,宏觀擴展和引用在那一個。 –

+1

他很可能會問爲什麼(類型')返回clojure.lang.Symbol。但我不是魔術師! – Chiron