加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 如何在Clojurescript中实现Atoms?

发布时间:2020-12-14 23:48:13 所属栏目:Java 来源:网络整理
导读:在 Clojure to address concurrency问题 we can use an atom写: user= (def my-atom (atom 0))#'user/my-atomuser= @my-atom0user= (swap! my-atom inc)1user= @my-atom1user= (swap! my-atom (fn [n] (* (+ n n) 2)))4 我们知道这(在Clojure实现中)是a wra
在 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

(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)))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读