지도를 참조하고지도에서 키 값 쌍을 증가시키는 약간의 Clojure 코드를 작성 중입니다. 나는 ref를 올바르게 사용하고 있다고 생각하지만, 원자에 대해서는 확실하지 않습니다. 스왑을 사용해야합니까? 더 관용적 일까? 나는 STM과 Clojure에 익숙하지 않다.이게 thread-safe/sane으로 보이는가? 내가 뭘 놓치고 있니? 그것은 매우 관용적 Clojure의 아니다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
#<[email protected]: {yellow #<[email protected]: 1>}>
#<[email protected]: {yellow #<[email protected]: 2>}>
멋진 데 감사합니다. –