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
