Я разрабатываю немного кода Clojure, который будет ссылаться на карту и увеличивать пару значений ключа на карте. Я думаю, что правильно использую ref, но я не уверен насчет атома. Нужно ли использовать swap! быть более идиоматичным? Я новичок в STM и Clojure, выглядит ли это потокобезопасным/нормальным? Что мне не хватает?
(defn increment-key [ref key]
(dosync
(if (= (get @ref key) nil)
(alter ref assoc key (atom 1))
(alter ref assoc key (atom (inc @(get @ref key)))))))
(defn -main [& args]
(def my-map (ref {}))
(increment-key my-map "yellow")
(println my-map)
(increment-key my-map "yellow")
(println my-map))
Отпечатки
$ lein run
#<Ref@494eaec9: {yellow #<Atom@191410e5: 1>}>
#<Ref@494eaec9: {yellow #<Atom@7461373f: 2>}>