On Tue, Apr 6, 2010 at 3:43 PM, Douglas Philips <d...@mac.com> wrote:

>  (def john-doe {:name "John Doe" :email "j...@doe.com"})
>
> (def account {:identity john-doe :balance 100} )
>
> (assoc john-doe :email "john.doe at gee mail.com")
>
> Now the account contains old/obsolete data and no cycles are needed to
> cause that.
>
> Doesn't seem that cycles are the problem...


The cycles are gone but the identity john-doe aand its curren-state are
still conflated so you get the same problem:
(def account {:identity john-doe :balance 100} )
(assoc john-doe :email "john.doe at gee mail.com")

On the first line you define a reference between the current value of
account and the current value of john-doe, so it is to be expected that
(assoc john-doe :email "john.doe at gee mail.com") won't give the expected
result since you didn't provided the system with enough knowledge.

(def account {:identity #'john-doe :balance 100} )
(def john-doe (assoc john-doe :email "john.doe at gee mail.com"))
; or (alter-var-root #'john-doe assoc :email "john.doe at gee mail.com")

there account points to the updated john-doe

Of course, one should not abuse vars, and the above code should at least be
rewritten with refs:

(def account (ref {:identity john-doe :balance 100}) )
(def john-doe (ref {:name "John Doe" :email "j...@doe.com"}))
(dosync (alter john-doe assoc :email "john.doe at gee mail.com"))

Really, to me the problem isn't creating cyclic data-structures but updating
them: the system must know which mutual references are to the identity (and
should be updated) and which are not. You have to give this information to
the system one way or the other, the system can't guess.

Btw, to some extent, one can create cyclic data-structures in Clojure (only
lazyseqs though -- unless you implement your own map or use lazy-map etc.) :
user=> (defn cyclic-seq [coll] (let [s (promise)] @(deliver s (lazy-cat coll
@s))))
user=> (let [s (cyclic-seq [1 2 3])] (identical? (seq s) (seq (drop 3 s))))
true

Christophe

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

To unsubscribe, reply using "remove me" as the subject.

Reply via email to