2012-08-03 77 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