为什么Clojure的原子交换!返回新值?

woo*_*ngs 7 clojure

大多数原子运算符在交换之前返回先前的值,例如std::atomic::fetch_add在C++中.使用原子int作为从0开始的全局递增id是很自然的.为什么Clojure的原子返回交换的值?

(def global-counter (atom 0))
(defn next! [] (dec (swap! global-counter inc)))
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法在Clojure中创建一个从零开始的计数器?

Die*_*sch 2

swap!允许您对原子应用任意函数,并且您事先不知道结果会是什么。如果swap!没有给你post value,它的用处就小了;如果你想知道结果,你必须创建一个事务来取消引用它(或者有人可以在你取消引用它之前更新它)。