On Nov 15, 9:05 am, Danny Woods <dannywo...@gmail.com> wrote: > > Danny, could you maybe hack up a possible very simple example of what > > you mean? > > <snip> > > > I can not simply store a copy of the Karl person in Tinas :friends > > slot, > > because when Karl gets one year older, then I don‘t want to go through > > all persons, looking for Karls, and have their age updated. > > Hi André, > > Your shared instance constraint does make things a little more > interesting than in my application, but I think John's suggestion > about not storing friend instances directly is a good thing. If you > were to instead assign an id to each created person, and have each > friend list be a list of ids, the entity referred to by the id can > still be immutable for a given dereference. Not sure how much sense > that makes, so here's something crude that I've hacked up: > > (def *everyone* (ref {})) > (def *global-id* (ref 0)) > > (defn next-id [] (dosync (commute *global-id* inc))) > > (defstruct person :name :friend-ids :id) > > (defn make-person [name] (struct person name [] (next-id))) > > (defn make-and-add-person [name] > (let [person (make-person name)] > (dosync (alter *everyone* assoc (:id person) person)))) > > (defnbefriend[person friend] > (let [new-friend-list (conj (:friend-ids person) (:id friend)) > new-person (assoc person :friend-ids new-friend-list)] > (dosync > (alter *everyone* assoc (:id person) new-person)))) > > The 'down side' here is simply that you refer to people by ids, rather > than directly, but the up side is that a given deref of *everyone* is > immutable and consistent. > > Cheers, > Danny.
-- 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 Note that posts from new members are moderated - please be patient with your first post. 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