to answer your question directly, you would need to do something like this to make it work the way your example is set up:
(defn new-game [] (let [board (atom (into [] (repeat 9 nil)))] (fn [n & [i]] (cond (= n :x) (swap! board assoc i 'x) (= n :o) (swap! board assoc i 'o) (= n :print) (println @board))))) (def g1 (new-game)) (g1 :x 0) (g1 :print) On Thu, Apr 19, 2012 at 9:58 PM, Armando Blancas <abm221...@gmail.com> wrote: > You could keep the board in an atom so it can mutate; then try to find maybe > two good places for mutation to happen, your move and the program's. With > the rest being functional you'll avoid the problems of global state while > not being forced to fit your logic into a loop of some re-binding that > simulates mutation. > > > On Thursday, April 19, 2012 3:21:56 PM UTC-7, Craig Ching wrote: >> >> Ok, I've read that what I want to do is a no no. But this is the sort of >> thing I did in Scheme about 20 years ago (and because of that I'm probably >> misremembering ;-)). >> >> Basically I'm learning clojure and thought I'd write a tic tac toe game. >> But not any tic tac toe, I want to write one where I can have multiple >> games going simultaneously. Something like: >> >> (def g1 (new-game)) >> (def g2 (new-game)) >> >> (g1 :x 0) >> (g1 :print) >> (g2 :x 5) >> (g2 :print) >> >> So the schemer in me (and probably the imperative programmer as well) >> thought I could return a clojure that encapsulates the board value, >> something like this: >> >> (defn new-game [] >> >> (let [board (into [] (repeat 9 nil))] >> >> (fn [n i] >> >> (cond >> >> (= n :x)(set! board (assoc board i 'x)) >> >> (= n :o)(set! board (assoc board i 'o)) >> >> (= n :print) (println board))))) >> >> >> Of course I get an error saying I can't bind to the non-mutable board. >> >> I'm really new to Clojure, so apologies if this is really basic for this >> list. Can I do what I want or can someone point me in the right direction? >> I've seen some other tic tac toe implementations on github, but they use >> recur to track state and I was hoping there was a cleaner idiomatic way than >> that. >> >> Thanks! >> > -- > 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 -- 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