Clojure:在let绑定中展开var

时间:2013-12-08 03:45:13

标签: binding clojure eval

我想在let形式的不同功能中重用一组本地分配。我们说

(def common-assign
  [x 10
   y 20])

一种方法是使用eval

(eval `(defn ~'foo []
         (let [~@common-assign
               ~'hello "world"])
         balala))

问题是现在你必须引用所有其他符号,这很麻烦。

还有其他干净的方法可以做我想要的吗?

3 个答案:

答案 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
  []
  ...)