(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)))