从 Clojure 中的闭包覆盖本地绑定?
Override local bindings from closure in Clojure?
我感兴趣的是在 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
并且只能访问结果函数的位置。
根据您的描述,无法解决您的问题。一旦闭包有 "closed over" 个自由参数,它们就无法更改。
要解决这个问题,您必须创建一个新的闭包,或者重新定义 triple-adder-fn
以使用全局动态变量而不是局部参数。或者,您可以复制 triple-adder-fn
并根据需要更改副本。
我感兴趣的是在 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
并且只能访问结果函数的位置。
根据您的描述,无法解决您的问题。一旦闭包有 "closed over" 个自由参数,它们就无法更改。
要解决这个问题,您必须创建一个新的闭包,或者重新定义 triple-adder-fn
以使用全局动态变量而不是局部参数。或者,您可以复制 triple-adder-fn
并根据需要更改副本。