私は、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
を制御せず、結果として得られる機能にしかアクセスできない状態にいます。
私はこれが結果であることを期待しましたが、私は尋ねなければなりませんでした。私にとっての問題は、triple-adder-fnが実際にサードパーティのライブラリにあり、関数を返すだけでさらに多くの作業をすることです。出力関数だけを再定義するためにライブラリ関数をローカルコードに複製することは、将来私自身の痛みを引き起こす確実な方法です。 – Kasuko