Clojure で get-and-set 関数を記述するより慣用的で読みやすい方法はありますか?
(def the-ref (ref {}))
(defn get-and-set [new-value]
(dosync
(let [old-value @the-ref]
(do
(ref-set the-ref new-value)
old-value))))
Clojure で get-and-set 関数を記述するより慣用的で読みやすい方法はありますか?
(def the-ref (ref {}))
(defn get-and-set [new-value]
(dosync
(let [old-value @the-ref]
(do
(ref-set the-ref new-value)
old-value))))
単純なケースでは、この操作が関数にラップされるのではなく、直接使用されるのを見る傾向があります。
hello.core> (dosync (some-work @the-ref) (ref-set the-ref 5))
5
この場合、通常、探してdosync
いるラッパーとして機能します。dosync
dosyncは他のトランザクションとうまく構成され、トランザクションの境界を表示するため、これは重要です。ラッパー関数がrefへのすべての参照を完全にカプセル化できる位置にいる場合は、おそらくrefは最適なツールではありません。
refの一般的な使用法は、次のようになります。
(dosync (some-work @the-ref @the-other-ref) (ref-set the-ref @the-other-ref))
refを使用する場合、目前の問題では調整された変更が必要になるため、通常は複数のrefのグループで使用されるため、ラップする必要はほとんどありません。それらが1つの値にすぎない場合は、アトムがより一般的です。