比较和设置!无条件地重置clojure中的原子?

时间:2013-03-16 16:31:18

标签: clojure

考虑clojure repl中的以下代码序列

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

产生预期的{42 [:a 7]}。现在试试

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

生成false,意味着compare-and-set!操作未成功。我很惊讶,因为我希望elemselems操作中与compare-and-set!测试相同。我知道我可以使用reset!来实现无条件重置原子的目标,但我想知道为什么compare-and-set!不能完全相同?

1 个答案:

答案 0 :(得分: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 {})