【发布时间】:2013-04-06 08:59:45
【问题描述】:
我正在编写一些 Clojure 代码,该代码将引用映射并增加映射中的键值对。我认为我正确使用了 ref,但我不确定 atom。我需要使用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>}>
【问题讨论】:
-
酷,谢谢,贴在那儿