output: |# # | | # | | # | | # # # | | | | | | | | | | # # | | # | | # # # | | # | | | Error: (car) bad argument type: () ..... code: (let* ((board '((1 0 0 1 0 0 0) (0 1 0 0 0 0 0) (0 0 1 0 0 0 0) (0 1 1 1 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0))) (temp '()) (size (length (car board))) (cell-index (lambda (i j) (list-ref (list-ref board j) i))) (printboard ;displays the board and calls the calling continuation (lambda (cc) (let loop ((cc cc)) (display (string-join (map (lambda (line) (string-join `("|",@(map (lambda (cell) (cond ((eq? cell 0) " ") ((eq? cell 1) "# ") (else (error "bad cell data" cell)))) line) "|\n")"")) board) "")) (loop (call/cc cc))))) (alive-neighbors ;calculates the number of neighboring cells that are alive (lambda (i j) (let* ((coords (filter (lambda (point) (not (or (< (car point) 0) (< (cadr point) 0) (> (cadr point) size) (> (car point) size)))) `((,(- i 1) ,(- j 1)) (,(- i 1) ,j) (,(- i 1) ,(+ j 1)) (,i ,(- j 1)) (,i ,(+ j 1)) (,(+ i 1) ,(- j 1)) (,(+ i 1) ,j) (,(+ i 1) ,(+ j 1))))) (cells (map (lambda (point) (cell-index (car point) (cadr point))) coords))) (apply + cells)))) (update ;will eventually set! board to updated version (lambda (cc) (let loop ((cc cc)) (set! board (let loop-i ((i 0) (t-board '())) (if (< i (- size 1)) (loop-i (+ i 1) (cons (let loop-j ((j 0) (line '())) (if (< j (- size 1)) (loop-j (+ j 1) (cons ((lambda (x) (cond ((< x 2) 0) ((eq? x 2) (cell-index j i)) ((eq? x 3) 1) ((> x 3) 0))) (alive-neighbors j i)) line)) (reverse line))) t-board)) (reverse t-board)))) (loop (call/cc cc)))))) (define p (call/cc printboard)) (define u (call/cc update)) (set! p (call/cc p)) (set! u (call/cc u)))