Aaron Feng on 5 Feb 2010 17:16:36 -0800


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Game of life


Hi Sean,

Thanks for all the suggestions.  I do plan on improving it iteratively.

> * Use a vector of vectors stored in an agent for env, not a 2D java
> array.  This is a little slower, but mutating arrays in place is not a
> good example for beginning Clojure.  I'll refer to this vector of
> vectors as a "board"

This was my initial idea, but for some reason I went away from it.
I'll update it to use vectors.

> * The run fn should take a board in, and return a board one step
> later.  This fits in with Clojure's built in stuff better (see below)

Agreed.

> * Trim down alive & dead cell rules, and use get w/ a default.

> user=>(defn dead-rule [neigh]
> (get {3 resurrect-cell} neigh kill-cell))

> user=>(defn alive-rule [neigh]
> (get {2 resurrect-cell
>       3 resurrect-cell}
>       neigh kill-cell))

I really like this improvement.  It really reduced the number of
lines.  But technically "get" can be removed from your code, since map
itself is also a function.

> * decouple the printing from the run fn.  Using an agent will really
> help with this, and make it easier to graft some Swing/SWT/whatever on
> later.

I actually already started a swing front-end, but I didn't get time to
finish it.  I pushed some updates to my github repo already, I'll make
more later.

Great suggestions,

Aaron