Clojure:在let绑定中展开一个var



我想重用不同函数的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
  []
  ...)

最新更新