2017-04-18 3 views
1

私はClojureの初心者です。原子、参考文献、エージェントなどの並行処理システムについては読んだことがあります。私がドキュメントを見つけることができないのは、さまざまな機能で使用するために異なるシステムにデータ構造をラップできるかどうかということです。アトムとエージェントで1つのデータ構造を同時にラップすることはできますか?

のは、私はこのようなデータを表現するとしましょう:

{ :id {:counter 0 :text: ""}, :id2 {:counter 0 :text: ""} } 

私は、個々のネストされたマップのカウンタを更新するためのアトムを使用していたので、私はこのような原子に定義:

(def myAtom (atom {})) 

をしかし、ラッピングマップに新しいマップ構造を追加するだけでエージェントを使う方が便利だろうと思います。 それで、私の原子を下のようなエージェントにラップするのは意味がありますか?

(def myAgent (agent myAtom)) 

それとも、最初のマップを定義し、原子およびエージェントで別々にそれをラップするために多くの意味を成していますか?

(def myMap {}) 
(def myAtom (atom myMap)) 
(def myAgent (agent myMap)) 

これらの操作に2つの別個のデータ構造を使用し、後でデータをマージする方がよいでしょうか?ここで

+4

マップはので、あなたの原子とエージェントが異なるバージョンで動作します不変であり、1で行われた変更が反映されませんもう片方に。 – Lee

答えて

1

は、あなたがそれを結果に

(def data (atom {:id {:counter 0 :text ""}, :id2 {:counter 0 :text ""}})) 
(println @data) 

(swap! data update-in [:id :counter] inc) 
(println @data) 

(swap! data update-in [:id2 :counter] inc) 
(println @data) 

を行うべきかです:

{:id {:counter 0, :text }, :id2 {:counter 0, :text }} 
{:id {:counter 1, :text }, :id2 {:counter 0, :text }} 
{:id {:counter 1, :text }, :id2 {:counter 1, :text }} 
関連する問題