在
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.
有趣的是,Atoms are replicated in ClojureScript处于句法级别 – 即使JavaScript运行时没有原子参考.
我的问题是,如何在Clojurescript中实现Atoms?它们只是一个对象包装器吗?
解决方法
它只返回并分配值.
在源头
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
检查swap的执行情况!并重置!你会发现:
(设置!(.-状态a)新值)
然后,转到https://github.com/clojure/clojurescript/blob/3bb97961cbc958aeaeac506222dc7b9dcb0e9fc1/src/clj/cljs/compiler.clj#L771集!你会发现编译器只发出一个’赋值语句’:
- (defmethod emit* :set!
- [{:keys [target val env]}]
- (emit-wrap env (emits target " = " val)))