2014-02-17 15 views
6

In Clojure to address concurrency Ausgaben we can use an atom zu schreiben:Wie werden Atome in Clojurescript implementiert?

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 

Wir wissen, dass dies (bei der Umsetzung Clojure) a wrapper around the Java Atomic object ist.

Interessanterweise, Atome are replicated in ClojureScript, auf einer syntaktischen Ebene - obwohl JavaScript-Laufzeiten keine Atomic-Referenz haben.

Meine Frage ist, Wie sind Atome in Clojurescript implementiert? Sind sie nur ein Objekt Wrapper?

+2

Javascript ist einziges Gewinde versehen, so bezweifle ich, es ist viel zu es. –

Antwort

14

Es gibt nur zurück und weist den Wert zu.

In der Quelle https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L4081

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

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

Überprüfung der Umsetzung der swap! und reset! finden Sie alle:

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

dann gehen, um https://github.com/clojure/clojurescript/blob/3bb97961cbc958aeaeac506222dc7b9dcb0e9fc1/src/clj/cljs/compiler.clj#L771 die set!, werden Sie die Compiler finden nur eine ‚Zuordnungsanweisung‘ aussendet:

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

Ich denke, Beobachter Implementierung ist interessanter. – edbond