我有一个手动引用代码的函数。
用法如下
(statem/lazy-call `(page->csrf-token ~r))
但我不记得总是使用反引号(`)来标记sexp,并且要取消quote所有在环境中使用的符号。
使用宏来完成这个工作是什么样的?我到目前为止有了这个:
(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)))
但如果有引用列表在其他代码块身体或特殊形式中,它就不起作用。