Переопределить локальные привязки от закрытия в 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 и иметь доступ только к полученной функции.

1 ответ

Решение

Из вашего описания нет решения вашей проблемы. Как только закрытие "закрыло" свободные параметры, они не могут быть изменены.

Чтобы решить эту проблему, вам придется сделать новое закрытие или, возможно, переопределить triple-adder-fn использовать глобальные динамические переменные вместо локальных параметров. Или вы можете скопировать triple-adder-fn и измените копию, чтобы работать, как вы хотите.

Другие вопросы по тегам