You might be able to simplify this by having just one Ref containing the global "state" of the game. -S
On Jan 4, 12:59 pm, Timothy Pratley <timothyprat...@gmail.com> wrote: > 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 -~----------~----~----~----~------~----~------~--~---