(defun setnext (world i j) (let* ((current (world-current world)) (next (world-next world)) (neighbors (count-neighbors current i j))) (if (zerop (bit current i j)) (cond ((not (= neighbors 3)) (setf (bit next i j) 0)) (t (setf (bit next i j) 1) (incf (world-numdots world)))) (cond ((or (= neighbors 2) (= neighbors 3)) (setf (bit next i j) 1)) (t (setf (bit next i j) 0) (decf (world-numdots world))))) (unless (zerop (bit next i j)) (when (< i (world-xmin world)) (setf (world-xmin world) i)) (when (> i (world-xmax world)) (setf (world-xmax world) i)) (when (< j (world-ymin world)) (setf (world-ymin world) j)) (when (> j (world-ymax world)) (setf (world-ymax world) j))))) (defun life (source) (let* ((size (length (car source))) (life (make-world :size size :current (make-array (list size size) :element-type 'bit :initial-contents source) :next (make-array (list size size) :element-type 'bit :initial-element 0) :numdots 0))) (dotimes (i size) (dotimes (j size) (unless (zerop (bit (world-current life) i j)) (incf (world-numdots life)) (when (< i (world-xmin life)) (setf (world-xmin life) i)) (when (> i (world-xmax life)) (setf (world-xmax life) i)) (when (< j (world-ymin life)) (setf (world-ymin life) j)) (when (> j (world-ymax life)) (setf (world-ymax life) j))))) (propagate life 0)))