2

我感兴趣的是在 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并且只能访问结果函数的位置。

4

1 回答 1

4

根据您的描述,您的问题没有解决方案。一旦闭包“关闭”了免费参数,它们就无法更改。

要解决这个问题,您必须创建一个新的闭包,或者重新定义triple-adder-fn以使用全局动态变量而不是局部参数。或者,您可以复制triple-adder-fn并更改副本以按照您的意愿工作。

于 2017-04-04T19:04:03.993 回答