我想在let
形式的不同功能中重用一组本地分配。我们说
(def common-assign
[x 10
y 20])
一种方法是使用eval
:
(eval `(defn ~'foo []
(let [~@common-assign
~'hello "world"])
balala))
问题是现在你必须引用所有其他符号,这很麻烦。
还有其他干净的方法可以做我想要的吗?
答案 0 :(得分:3)
(defmacro with-common [& body]
`(let ~'[x 10, y 20]
~@body))
(with-common (+ x y))
答案 1 :(得分:2)
(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))
答案 2 :(得分:0)
你可以使用一个闭包。
(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
[]
...)