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