A while ago I wrote a short MUD which had to keep track of a changing
group of players, and other data. Retrospectively I've developed a
helper which can update in place any mutable map, handles nested
access, and behaves like assoc on immutables.

It allows usage like so:
; set up a mutable map of mutable players - tongue twister
(def players (ref nil))
(mset players "tim" (ref {:str 5 :con 5}))
(mset players "tom" (ref {:str 7 :con 2}))

; change some attributes
(mset players "tim" :str 6)
(mset players "tim" :con 4)
(mset players "tim" :friend (@players "tom"))

; results in pretty much what you might expect
(println "tim:" @(@players "tim"))
(println "tom:" @(@players "tom"))
(println "tim's friend" @((@players "tim") :friend))
tim: {:str 6, :con 4}
tom: {:str 7, :con 2}
tim's friend {:str 7, :con 2}

http://groups.google.com/group/clojure/web/helper.clj

Working on the deletion side I ran into a bit of a block when trying
to nil refs that were being removed:

; dissoc versions
(defmulti mdel (fn [m & args] (class m)))
(defmethod mdel clojure.lang.Ref [v]
  (dosync (ref-set v nil)))
(defmethod mdel clojure.lang.Ref [m k & more]
  (if more
    (apply mdel (@m k) more)
    (dosync (mdel (@m k))
      (ref-set m (dissoc @m k))))
  m)

(mdel (ref 5))
-> arity exception

I'm not sure why... I suspect it is something obvious I'm overlooking.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to