2013-11-22 7 views
5

私の問題は、提供されたドキュメントとサンプルでは、​​:keyパラメータまたはその可能な値の意味を理解できません。 これは、私は言及しています:
http://clojuredocs.org/clojure_core/clojure.core/add-watch何が意味するのですか:add-watch関数のキーパラメータ

追加-時計をclojure.core

(add-watch reference key fn) 

は、エージェント/原子の/ var /再に、時計の機能を追加しますf参照。時計fn は、4つの引数のfnでなければなりません。キー、参照、古い状態、 新しい状態です。参照の状態が変更されたときはいつでも、 登録されている時計の機能が呼び出されます。時計fnは エージェントのスレッドで同期的に呼び出されます。エージェントの前には、 が保留中のエージェントまたはrefの場合に送信されます。アトムまたはrefの状態はfnコールの前に再び変更された可能性がありますので、参照を逆参照するよりも古い/新しい状態の を使用してください。watch fnsは複数のスレッドから同時に と呼ばれることに注意してください。 Varウォッチャーは、スレッドバインドの変更によってのみ にトリガされ、スレッドローカルでは設定されません。キーは参照ごとに一意の でなければなりません。また、取り外し時計、 で時計を取り外すために使用できますが、時計機構では不透明と見なされます。答えの右が

おかげ

答えて

9

基本的には、参照ごとに複数の時計がある場合に、コードを呼び出してコードを識別するために使用できる識別子です。これは、アプリケーションコードにとって重要な意味を持ちますが、Clojureによって渡されます。例えば

user> (def a (atom 0)) 
#'user/a 
user> (add-watch a 
       :count-to-3 
       (fn [k r old-state new-state] 
        (println "changed from" old-state "to" new-state) 
        (when (>= new-state 3) 
         (remove-watch a :count-to-3)))) 
#<[email protected]: 0> 
user> (dotimes [_ 5] (swap! a inc)) 
changed from 0 to 1 
changed from 1 to 2 
changed from 2 to 3 
nil 
user> @a 
5 
+0

'匿名関数には何の略r'のでしょうか? – qed

+0

'r'はあなたが見ているもので、この場合は原子' a'です。逆参照した場合は 'new-state'と同じです。 – Kris

8

キーは、基準ごとに一意である必要があり、および削除ウォッチで 時計を除去するために使用することができるが、それ以外 により不透明と考えられています時計機構。

言い換えれば、実際の時計機構は、(指定したrefで設定されたハンドラの中で一意である限り)キーを何に設定しても気にしませんが、 remove-watchに電話してハンドラを取り除きたい場合は

関連する問題