我感兴趣的是,如果可以在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 = 1
和b = 2
绑定的本地闭包,当我调用triple-adder
时,它会相应地使用它们。
现在的问题是,我可以做一些像下面的模拟代码那样允许我覆盖那些本地绑定吗?
(binding ['a 5
'b 6]
(triple-adder 3))
;; => 14
对于我的简单示例,调用triple-adder-fn
以获取具有新绑定的新函数非常容易。但是,根据我的实际情况,我处于一个我实际上无法控制triple-adder-fn
并且只能访问结果函数的位置。
答案 0 :(得分:4)
根据您的描述,您的问题无法解决。一旦关闭已经“关闭”免费参数,它们就无法改变。
要解决此问题,您必须创建一个新的闭包,或者重新定义triple-adder-fn
以使用全局动态变量而不是本地参数。或者,您可以复制triple-adder-fn
并根据需要更改副本。