我有一个用于手动引用代码的函数。
使用情况如下
(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)))
但如果列表或特殊表单在体内部或在外部时,则此方法不起作用。