クロージャーのSTMは、時間の経過とともに変化するものの状態を維持することについてです。時々刻々と変化する状態を持つこれらの事柄は、「アイデンティティ」を持っていると言われています。 3ヶ月の "あなた"が120歳の時に "あなた"を認識しなくても、あなたの人生全体の "あなた"であるアイデンティティを持っているように。この中
user> (def current-strings (ref ["a" "b" "c"]))
#'user/current-strings
user> (dosync (alter current-strings (fn [the-string-at-this-instant]
(pmap #(.toUpperCase %) the-string-at-this-instant))))
("A" "B" "C")
user> @current-strings
("A" "B" "C")
user>
を:のは、文字列を格納し、並行して存在し、それらを変更するには、一般に入手可能な可変な場所を作ってみましょう
:我々はSTMを使用するための言い訳を持っているので、だからあなたの例では、可変何かを置くことができます例として、関数を適用して文字列コレクションの状態を変更したトランザクションを作成しました。内部的には、その関数が新しい値を並列して計算していました。それ自身のトランザクション内で独立して変更可能なもの、それぞれの束このより興味深いのは、可変物事のベクトルを作りましょう行い、その後、並列更新中にする
:あなたが見ることができるように
user> (def current-strings [(ref "a") (ref "b") (ref "c")])
#'user/current-strings
user> (doall
(pmap (fn [ref-to-update]
(dosync (alter ref-to-update #(.toUpperCase %))))
current-strings))
("A" "B" "C")
user> (map deref current-strings)
("A" "B" "C")
user>
を、これのどれもSTMが必要です。なぜなら、これらすべての操作は、他の変更可能なタイプのクロージャーで処理できるため、アトムは大きな選択肢になります。そしてrefsで遊ぶのも楽しいです!楽しむ!
私はこれを閉じるために投票しました。この問題は、解決の問題に関連する問題としてSTMにつながるスレッドコーディネーションの領域に要件がないため、うまくいきません。食器洗い機を使ってリンゴを食べる方法は? –