我似乎无法在宏定义上使用 binding
替换动态变量。
我的目标是
使用宏定义一个函数,当定义时“修复”一个动态变量。
(def ^:dynamic *pred?*
(fn []
(println "original pred")
false))
(defmacro macro-pred [fname a b]
`(defn ~fname []
(if (~*pred?*)
~a
~b))
)
(macro-pred demo 1 2)
(demo)
;; => 2
(defn my-pred []
(fn []
(println "my pred")
true))
(binding [*pred?* my-pred]
(macro-pred demo2 1 2))
(demo2);; => 2
(binding [*pred?* my-pred]
(macroexpand '(macro-pred demo2 1 2)))
;; => (def
;; demo2
;; (clojure.core/fn
;; ([] (if (#function[macros.demo/my-pred]) 1 2))))
在提供的代码片段中,我预计 (demo2)
的调用结果为 1
。看起来 macroexpand
想法是需要的,所以…我缺乏什么?