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
-~----------~----~----~----~------~----~------~--~---

  • mset Timothy Pratley
    • Re: mset Stuart Sierra

Reply via email to