評価したら
(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
動作が異なる理由は何ですか?