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

Re: Conway's Game of Life (cellular automata)



   > you left open the question of how HTDP would propose to design
   > the Life program.
   
   I think my comments about abstraction relate to something HtDP says about
   the importance of creating abstractions, which should have well-defined
   contracts.  

Sorry, Anton.  I just mean the "overall" design.  You handled the
"local" design just fine, but I thought mine was adequate as well.

   > But I ran into all kinds of mutability problems, so the list of
   > list functional version was easier to code up!
   
   If you want to build a vector recursively, without mutation,[...]

Sorry, I used plenty of mutation, lots of `string-set!', even `set!'.
That's the usual C approach, but Scheme makes it hard.  E.g.  I needed
`string-copy' in order to be able to mutate the "rows" of my matrices:

(define life 
  (vector 
   (string-copy "                                               ")
   (string-copy "                   x                           ")
   (string-copy "                xxxx                           ")
   (string-copy "       x       xxxx                            ")))

   
Took me a while to see why I couldn't mutate this (shared structure):

(define life (make-vector 30 (make-string 80 #\space)))

 
   > This shows an inelegancy of the x/y approach: your function
   > `new-cell-state' does "the same thing" no matter what x & y are.
   
   I'm not sure I follow you.  x & y is simply a concise way to
   specify a set of nine cells, in this case, and potentially, a
   larger set, although you're saying that for this specific
   application a larger set isn't needed.

Maybe I'm making an OOP point.  I'm just saying that `new-cell-state'
doesn't need the values of x & y, but only the nearest cells, which in
x/y lingo are of course are described by

(x-1,y-1) (x-1,y) (x-1,y+1)
 
(x,y-1)           (x,y+1)
 
(x+1,y-1) (x+1,y) (x+1,y+1)

Surely you agree.  And it would work just as well to describe these
neighbors "relatively" instead of "absolutely" as I did:

nw n ne
w     e
sw s se

But then I referred to these nearest neighbors as 

(car top) (cadr top) (caddr top)
(car row) (cadr row) (caddr row)
(car bot) (cadr bot) (caddr bot))

which is pretty cumbersome, and I imagine slow as well, and I don't
see that as any improvement over your matrix approach, other than
being functional (no mutation).