我有一个捕获代码的函数,其中我手动对代码进行引用。
使用方法如下
(statem/lazy-call `(page->csrf-token ~r))
但总是忘记为 sexp 添加反引号,以及取消对环境中所有符号的引用。
我如何使用宏来做这件事?我到目前为止是这样的
(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)))
但是当引用的列表在主体或其他特殊形式中时,这不起作用。