如果我评估
(def ^:macro my-defn1 #'defn)
定义了一个名为“my-defn1”的宏,我可以像使用“defn”一样使用它。
但是,如果我改为评估
(if true
(def ^:macro my-defn2 #'defn))
'my-defn2' 的 var 没有 :macro 元数据集,我不能将它用作宏,即使 'def' 形式与前一种情况相同。
这是完整的代码(http://cljbin.com/paste/52322ba5e4b0fa645e7f9243):
(def ^:macro my-defn1 #'defn)
(if true
(def ^:macro my-defn2 #'defn))
(println (meta #'my-defn1)) ; => contains :macro
(println (meta #'my-defn2)) ; => doesn't contain :macro!
(my-defn1 hello1 []
(println "hello 1"))
(hello1) ; => prints "hello 1"
(my-defn2 hello2 [] ; => CompilerException: Unable to resolve
(println "hello 2")) ; symbol: hello2 in this context
是什么让行为不同?