我有一个函数用于捕捉代码,我必须手动输入代码。
用法看起来像这样
(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)))
但如果在体内或其它特殊形式中存在引用列表,则它不会起作用。