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