Clojureのatom
非協調的、同期的な変更の管理
他のatomの値とは関係なく更新できる
これを非協調的と呼んでる
atom
atomを作成
deref
, @
atomにアクセス
swap!
atomの値の変更
swap!(a, fn)
atomである a
に1引数関数fnを適用して a
を更新する
reset!
例
mal(lisp)user> (def! atm (atom (list 0 1 2 3 4 5 6 7 8 9)))
(atom (0 1 2 3 4 5 6 7 8 9))
user> (first @atm)
0
user> @atm
(0 1 2 3 4 5 6 7 8 9)
user> @atm
(0 1 2 3 4 5 6 7 8 9)
user> (swap! atm (fn* [a] (concat (rest a) (list (first a)))))
(1 2 3 4 5 6 7 8 9 0)
user> (swap! atm (fn* [a] (concat (rest a) (list (first a)))))
(2 3 4 5 6 7 8 9 0 1)
user> (swap! atm (fn* [a] (concat (rest a) (list (first a)))))
(3 4 5 6 7 8 9 0 1 2)
user> (deref atm)
(3 4 5 6 7 8 9 0 1 2)
普通の変数とは何が違うの
immutabelであること?
どんな値でも追加できるの?
いけるっぽい
clojure(def! a (atom (fn* (a) a)))
((deref a) 10) ; 10