1

clojurereplの次のコードシーケンスを検討してください

(def elems (atom {}))
(swap! elems assoc 42 [:a 7])
elems

期待されるものを生み出す{42 [:a 7]}。今すぐお試しください

(compare-and-set! elems elems (atom {}))

生成します。これは、操作が成功しなかったことfalseを意味します。操作の内部と同じようにテストするcompare-and-set!ことを期待していたので、私は驚いています。アトムを無条件にリセットするという目標を達成するために使用できることは知っていますが、なぜまったく同じことをしないのか知りたいのですが。elemselemscompare-and-set!reset!compare-and-set!

4

1 に答える 1

5

compare-and-set!アトム自体ではなく、アトムによって参照される値で機能します。

clojure.core/compare-and-set!
([atom oldval newval])
  Atomically sets the value of atom to newval if and only if the
  current value of the atom is identical to oldval. Returns true if
  set happened, else false

あなたはおそらくこれが欲しいでしょう:

(compare-and-set! elems @elems {})
于 2013-03-16T16:50:22.510 に答える