我想重用不同函数的let
形式的一组本地赋值。比方说
(def common-assign
[x 10
y 20])
一种方法是使用eval
:
(eval `(defn ~'foo []
(let [~@common-assign
~'hello "world"])
balala))
问题是,现在你必须引用所有其他符号,这很麻烦。
还有其他干净的方法可以做我想做的事吗?
(defmacro with-common [& body]
`(let ~'[x 10, y 20]
~@body))
(with-common (+ x y))
(def common-assign
['x 10
'y 20])
(defmacro defn-common [name args & body]
`(defn ~name ~args (let ~common-assign ~@body)))
(defn-common foo [a b c] (+ a b c x y))
您可以为此使用闭包。
(let [x 10
y 20]
(defn foo
[]
(let [hello "world"]
...)))
(defn bar
[]
...))
但是,为什么不直接引用命名空间中的值呢?
(def x 10)
(def y 20)
(defn foo
[]
(let [hello "world"]
...))
(defn bar
[]
...)