2017-04-04 10 views
2

私は、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 = 1b = 2のバインディングを持っていると私はtriple-adderを呼び出すとき、それはそれに応じて使用するローカルクロージャを作成します。

ここで問題になるのは、これらのローカルバインディングをオーバーライドできる次のモックコードのようなものですか?私の簡単な例については

(binding ['a 5 
      'b 6] 
    (triple-adder 3)) 
;; => 14 

新しいバインディングを使用して新しい機能を取得するためにtriple-adder-fnを呼び出すために本当の簡単だろう。しかし、私の実際の状況では、私は実際にはtriple-adder-fnを制御せず、結果として得られる機能にしかアクセスできない状態にいます。

答えて

4

問題の解決方法はありません。クロージャーがフリーパラメーターを「閉鎖」すると、変更することはできません。

これを解決するには、新しいクロージャを作成するか、おそらくtriple-adder-fnをローカルパラメータの代わりにグローバルダイナミックバーを使用するように再定義する必要があります。または、triple-adder-fnをコピーして、希望どおりにコピーを変更することができます。

+0

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

関連する問題