我有一个函数用于捕获代码,我手动引用代码。
用法如下
(statem/lazy-call `(page->csrf-token ~r))
但我总是忘记加引导符(backtick)和反引用环境中所有的符号。
有哪些方法可以用宏来实现这一点?我目前想到了这个
(deftype Call [code])
(defn call*
[code]
(Call. code))
(defmacro call
[& body]
`(call*
~(walk/postwalk
(fn [d]
(cond
(instance? clojure.lang.IPersistentList d) `(list ~@d)
:else d))
body)))
(let [foo (call (println "bar") '(foo bar) (+ 1 2))]
(println (.code foo)))
但是当在主体中或在其他特殊形式中有引用列表时,这个方法不起作用。