2012-08-03 64 views
32

我在瀏覽Clojure的來源,我的方式感到驚訝時,宏定義:的Clojure當宏觀

user=> (source when) 
(defmacro when 
    "Evaluates test. If logical true, evaluates body in an implicit do." 
    {:added "1.0"} 
    [test & body] 
    (list 'if test (cons 'do body))) 
nil 
user=> 

我期待它寫成這樣的事情,而不是:

(defmacro when [test & body] `(if ~test (do [email protected]))) 

爲什麼用這種不太常見的方式編寫實際的宏?

回答

67

core.clj是自上而下構建的,從Java提供的內容開始,並構建了Clojure的所有需求。當定義when時,語法引號尚不存在。
when宏被定義在core.clj的line 456和語法引號的要求並不可用,直到line 682.的當宏被用來定義語法引用

+4

我希望我有更多向上票給這個。 – 2012-08-04 00:20:06

+1

680行似乎是defmulti宏。和語法引號(我假設)是一個讀者宏。你能詳細說明語法引用需要什麼函數/宏嗎? – Kevin 2012-08-04 18:15:11

+0

凱文,你爲什麼不跟着這些行號後面的鏈接。在682行或附近沒有'defmulti',所以你可能正在看這個文件的其他版本。至於語法引用需要什麼,它很簡單:**在此特定版本的文件中定義在行682 **之上的所有內容。 – 2012-08-09 19:22:29