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

Reply via email to