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

Reply via email to