如何在Clojurescript中实现Atoms?

时间:2014-02-17 10:28:30

标签: multithreading concurrency clojure atomic clojurescript

Clojure to address concurrency个问题we can use an atom中写:

user=> (def my-atom (atom 0))
#'user/my-atom

user=> @my-atom
0

user=> (swap! my-atom inc)
1

user=> @my-atom
1

user=> (swap! my-atom (fn [n] (* (+ n n) 2)))
4

我们知道这(在Clojure实现中)是a wrapper around the Java Atomic object

有趣的是,原子are replicated in ClojureScript处于句法级别 - 即使JavaScript运行时没有原子参考。

我的问题是,如何在Clojurescript中实现Atoms?它们只是一个对象包装器吗?

1 个答案:

答案 0 :(得分:14)

只返回并指定值。

在源头 https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L4081

(deftype Atom [state meta validator watches]
  ...
  IDeref
  (-deref [_] state) 
  ...)

https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L4110

(defn atom
  "Creates and returns an Atom ..."
  ([x] (Atom. x nil nil nil))
  ([x & {:keys [meta validator]}] (Atom. x meta validator nil)))

检查swap!reset!的实施情况,您会发现:

(set! (.-state a) new-value)

然后,转到https://github.com/clojure/clojurescript/blob/3bb97961cbc958aeaeac506222dc7b9dcb0e9fc1/src/clj/cljs/compiler.clj#L771 set!,你会发现编译器只是发出'赋值语句':

(defmethod emit* :set!
  [{:keys [target val env]}]
  (emit-wrap env (emits target " = " val)))