Hi Phil, Thanks for the tips. Yes, alter and doseq do look better.
As far as the "running" variable, there is one thread painting the squares and another thread responding to the mouse click on start/ stop. This was the only way I could think of that the user could stop the paint thread, using a Java idiom. I'll read up on binding. Thank again! Larry On Mar 3, 1:30 pm, Phil Hagelberg <p...@hagelb.org> wrote: > lps540 <lps...@gmail.com> writes: > > I've written a small example of Conway's Game of Life using Clojure > > and Swing. Comments/critiques are welcome. > > Interesting program! > > (for [x (range 32) y (range 48)] > (ref-set cells > (assoc (deref cells) [x y] (= 0 (rand-int 5))))) > > While you can use ref-set this way, it's much more concise to use alter: > > (for [x (range 32) y (range 48)] > (alter cells assoc [x y] (= 0 (rand-int 5)))) > > You should use this in calc-state as well. > > Also, the paint-cells function is called only for side-effects. Instead > of using dorun+map, you should use doseq: > > (defn paint-cells [graphics] > (doseq [cell @cells] > (let [x (first (first cell)) > y (second (first cell)) > state (second cell)] > (doto graphics > (. setColor (if state Color/RED Color/WHITE)) > (. fillRect (* 10 x) (* 10 y) 10 10))))) > > I'm not sure if making "running" a ref makes sense here. Do you need to > coordinate change in it across threads, or will the change only happen > in one thread? If it's the former, using a thread-local var with > "binding" is probably a better choice. > > Also, instead of calling (deref cells), you can use @cells for short. > > -Phil --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---