gpt4 book ai didi

multithreading - Clojurescript中如何实现Atom?

转载 作者:行者123 更新时间:2023-12-04 13:27:19 26 4
gpt4 key购买 nike

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运行时没有Atomic引用。

我的问题是 Clojurescript中如何实现原子? 它们只是对象包装程序吗?

最佳答案

它只是返回并分配值。

在源头
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)
然后,转到 set!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)))

关于multithreading - Clojurescript中如何实现Atom?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21826514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com