Hey Greg, On Thu, Sep 11, 2014 at 12:30:11AM -0700, Greg MacDonald wrote: > So how come two agents can't contain one another? The following code causes > a StackOverflowError. In the real world things can't contain other things > cyclically so I suspect that's why, but if someone could explain this > better to me I'd appreciate it. :) - Greg > > (defn test-agents > [] > (let [a (agent {}) > b (agent {})] > (send-off a #(assoc %1 :other %2) b) > (send-off b #(assoc %1 :other %2) a)))
As far as I can tell this works properly, but printing it is a problem (as it's a structure with a cycle in it: a -> b -> a -> b -> ... a). We can see that it works, though: user=> (defn test-agents [] (let [a (agent {:a true}), b (agent {:b true})] (send-off a assoc :other b) (send-off b assoc :other a) [a b])) #'user/test-agents user=> (def ag (test-agents)) #'user/ag user=> (:a @(first ag)) true ;; the "first" one is a user=> (:b @(:other @(first ag))) true ;; a's "other" is b user=> (:a @(:other @(:other @(first ag)))) true ;; b's "other" is a Carlo
signature.asc
Description: Digital signature