多线程 – 如何在Clojurescript中实现Atoms?
在
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?它们只是一个对象包装器吗? 解决方法
它只返回并分配值.
在源头 (deftype Atom [state meta validator watches] ... IDeref (-deref [_] state) ...) 和 (defn atom "Creates and returns an Atom ..." ([x] (Atom. x nil nil nil)) ([x & {:keys [meta validator]}] (Atom. x meta validator nil))) 检查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))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |