在Clojure中覆盖闭包的局部绑定?

时间:2017-04-04 17:31:05

标签: clojure closures dynamic-rebinding

我感兴趣的是,如果可以在Clojure中编程时重新定义或覆盖作为闭包结果的绑定?

例如,我可以做到以下几点:

(defn triple-adder-fn [a b] (fn [x] (+ x a b)))

(def triple-adder (triple-adder-fn 1 2))

(triple-adder 3)
;; => 6

然而,这会创建一个具有a = 1b = 2绑定的本地闭包,当我调用triple-adder时,它会相应地使用它们。

现在的问题是,我可以做一些像下面的模拟代码那样允许我覆盖那些本地绑定吗?

(binding ['a 5
          'b 6]
  (triple-adder 3))
;; => 14

对于我的简单示例,调用triple-adder-fn以获取具有新绑定的新函数非常容易。但是,根据我的实际情况,我处于一个我实际上无法控制triple-adder-fn并且只能访问结果函数的位置。

1 个答案:

答案 0 :(得分:4)

根据您的描述,您的问题无法解决。一旦关闭已经“关闭”免费参数,它们就无法改变。

要解决此问题,您必须创建一个新的闭包,或者重新定义triple-adder-fn以使用全局动态变量而不是本地参数。或者,您可以复制triple-adder-fn并根据需要更改副本。