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

Attachment: signature.asc
Description: Digital signature

Reply via email to