(defparameter *game-file* #p"game-state.lisp")
(setf *read-eval* nil *print-circle* t
     *print-pretty* t)
(defvar *board*)

(with-open-file (unused #p".lck" :direction :output
                :if-does-not-exist :create
                :if-exists :supersede)
(setq *board*
(let ((array (if (probe-file *game-file*)
                (with-open-file (in *game-file*
                                   :direction :input)
                 (read in))
            (make-array '(19 19) :initial-element "."))))
    (lambda (stream &optional (move nil) (write nil))
           (when move (setf (aref array (- 19 (second move)) (1- (first move)))
                           (third move)))
           (if write (prin1 array stream)
               (princ array stream)))))

(handler-case
(let* ((query-string (ext:getenv "QUERY_STRING"))
       (move (with-input-from-string (s query-string)
              (when (peek-char #\( #|)|# s nil nil)
               (read s)))))
 (terpri)
 (if move (funcall *board* t move)
    (funcall *board* t)))
(t (e) (format t "I am unhappy about ~a~%" e)))

(with-open-file (out *game-file*
                   :direction :output
                   :if-exists :supersede
                   :if-does-not-exist :create)
(funcall *board* out nil t)))

(terpri)
(quit)