オセロ必勝法 Part2

石を返す前に、石を置くのを忘れてました。
あと、initableをちょっと修正しました。

(defun Osero ()
  (let ((table nil))
  (defun initable (table sq)
    (defun initableat (table)
      (cond ((not table) (setq table '((0 0))))
	    ((= (cadr (car table)) (1- sq)) (setq table (push `(,(1+ (caar table)) 0) table)))
	    (t (setq table (push `(,(caar table) ,(1+ (cadr (car table)))) table)))
	    table))
    (defun nest (f x n)
      (let ((i 0)
	    (out x))
	(while (<= i n)
	  (setq out (funcall f out))
	  (setq i (1+ i)))
	out))
    (defun nulltable (table)
      (mapcar '(lambda (x) (list x 'null)) table))
    (setq table (nulltable (reverse (nest 'initableat nil (1- (* sq sq))))))))
  (defun setdisk (table sq x y disk)
    (setf (cadr (elt table (+ (* sq x) y))) disk)
    table))

(Osero)
setdisk
(initable nil 2)
(((0 0) null) ((0 1) null) ((1 0) null) ((1 1) null))
(setdisk (initable nil 2) 2 1 0 'white)
(((0 0) null) ((0 1) null) ((1 0) white) ((1 1) null))

今度こそ、石を返そうと思います。