Yes, that does. Thanks to both of you. Tim
On Oct 25, 10:16 am, Chris Perkins <chrisperkin...@gmail.com> wrote: > On Tuesday, October 25, 2011 12:00:04 PM UTC-4, Tim Robinson wrote: > > > This code probably will not make a whole lotta sense since I reduced > > it down to show only the problem at hand, but I'm hoping someone can > > explain why this doesn't work the way I expected it would: > > > => (def data (atom {:k1 "v1" :k2 "v2" :k3 "v3"})) > > #'user/data > > > => (def flag (atom nil)) > > #'user/flag > > > => (defn oops! [] > > (let [x1 (atom (hash-map)) > > v1 (filter > > #(let [xv1 (@data %)] > > (if (= xv1 "v1") > > (swap! x1 assoc :k1 "other"))) > > (keys @data)) > > rxv (reset! flag @x1)] > > (println v1))) > > > => (oops!) > > (:k1) > > nil > > > => @flag > > {} > > > I had expected this flag would now hold the value from x1, but instead > > it's empty. > > > No, it's not empty - it holds the value that x1 had at the time you swapped > > it, which is an empty map. > > Later, the x1 atom had its value changed, by then it was too late to affect > flag. Specifically, x1 changed only when you printed v1, thus forcing > realization of the lazy sequence that filter returned. > > Make sense? > > - Chris -- 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