我有一个捕获代码的函数,其中我手动引用代码。
使用方法如下
(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)))
但是,如果代码体中有引用的列表或其他特殊形式,这个方法将不起作用。