[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 85/255: working with new set less some state-leak issues
From: |
Eric Schulte |
Subject: |
[elpa] 85/255: working with new set less some state-leak issues |
Date: |
Sun, 16 Mar 2014 01:02:24 +0000 |
eschulte pushed a commit to branch go
in repository elpa.
commit 6124fe7137e8cb6234f7fefe7ba59306b34dde1b
Author: Eric Schulte <address@hidden>
Date: Wed May 23 00:03:56 2012 -0400
working with new set less some state-leak issues
---
sgf-board.el | 116 +++++++++++++++++++++++++++++++++-------------------------
sgf-tests.el | 103 +++++++++++++++++++++++++++------------------------
sgf-trans.el | 2 +-
sgf.el | 8 +++-
4 files changed, 127 insertions(+), 102 deletions(-)
diff --git a/sgf-board.el b/sgf-board.el
index 7cdb913..84a5583 100644
--- a/sgf-board.el
+++ b/sgf-board.el
@@ -29,8 +29,8 @@
(require 'sgf-util)
(require 'sgf-trans)
-(defvar *history* nil "Holds the board history for a GO buffer.")
-
+(defvar *history* nil "Holds the board history for a GO buffer.")
+(defvar *size* nil "Holds the board size.")
(defvar *back-ends* nil "Holds the back-ends connected to a board.")
(defvar black-piece "X")
@@ -76,16 +76,11 @@
(dolist (data (cdr move)) (bset (car move) data)))))))
(defun clear-labels (board)
- (dotimes (point (length board))
+ (dotimes (point (length board) board)
(when (aref board point)
(unless (member (aref board point) '(:B :W))
(setf (aref board point) nil)))))
-(defun stones-for (board color)
- (let ((count 0))
- (dotimes (n (length board) count)
- (when (equal color (aref board n)) (incf count)))))
-
(defun neighbors (board piece)
(let ((size (board-size board))
neighbors)
@@ -101,15 +96,15 @@
(neighbors (remove-if (lambda (n) (member n already))
(neighbors board piece)))
(neighbor-vals (mapcar (lambda (n) (aref board n)) neighbors))
- (friendly-neighbors (delete nil (map 'list (lambda (n v)
- (when (equal v val) n))
- neighbors neighbor-vals)))
+ (friendly (delete nil (mapcar
+ (lambda (n) (when (equal (aref board n) val)
n))
+ neighbors)))
(already (cons piece already)))
(or (some (lambda (v) (not (or (equal v enemy) ; touching open space
(equal v val))))
neighbor-vals)
(some (lambda (n) (alive-p board n already)) ; touching alive dragon
- friendly-neighbors))))
+ friendly))))
(defun remove-dead (board color)
;; must remove one color at a time for ko situations
@@ -126,7 +121,7 @@
(when val (push (cons val n) pieces))))))
(defun pieces-to-board (pieces size)
- (let ((board (make-vector size nil)))
+ (let ((board (make-vector (* size size) nil)))
(dolist (piece pieces board)
(setf (aref board (cdr piece)) (car piece)))))
@@ -178,30 +173,34 @@
(body (board-body-to-string board)))
(mapconcat #'identity (list header body header) "\n")))
-(defun update-display ()
- (delete-region (point-min) (point-max))
- (goto-char (point-min))
- (insert
- "\n"
- (board-to-string (car *history*))
- "\n\n")
- (let ((comment (sgf<-comment (car *back-ends*))))
- (when comment
- (insert
- (make-string (+ 6 (* 2 (board-size (car *history*)))) ?=)
- "\n\n"
- comment)))
- (goto-char (point-min)))
+(defun ear-muffs (str) (concat "*" str "*"))
+
+(defun update-display (buffer)
+ (with-current-buffer buffer
+ (delete-region (point-min) (point-max))
+ (goto-char (point-min))
+ (insert "\n"
+ (board-to-string
+ (pieces-to-board (car *history*) *size*))
+ "\n\n")
+ (let ((comment (sgf<-comment (car *back-ends*))))
+ (when comment
+ (insert (make-string (+ 6 (* 2 *size*)) ?=)
+ "\n\n"
+ comment)))
+ (goto-char (point-min))))
(defun sgf-board-display (back-end)
(let ((buffer (generate-new-buffer "*GO*")))
(with-current-buffer buffer
+ (sgf-board-mode)
+ (when (sgf<-name back-end)
+ (rename-buffer (ear-muffs (sgf<-name back-end)) 'unique))
(set (make-local-variable '*back-ends*) (list back-end))
- (set (make-local-variable '*history*) nil)
- (push (make-board (sgf<-size back-end)) *history*)
- (sgf-board-mode))
- (when (sgf<-name back-end)
- (rename-buffer (sgf<-name back-end) 'unique))
+ (set (make-local-variable '*size*) (sgf<-size back-end))
+ (set (make-local-variable '*history*)
+ (list (board-to-pieces (make-board *size*))))
+ (update-display (current-buffer)))
(pop-to-buffer buffer)))
@@ -223,20 +222,19 @@
(defun sgf-board-act-move (&optional pos)
(interactive)
(unless pos
- (let ((size (board-size (car *history*))))
- (setq pos
- (cons
- (char-to-num
- (aref (downcase
- (org-icompleting-read
- "X pos: "
- (mapcar #'string
- (mapcar #'num-to-char (range 1 size)))))
- 0))
- (1- (string-to-number
- (org-icompleting-read
- "Y pos: "
- (mapcar #'number-to-string (range 1 size)))))))))
+ (setq pos
+ (cons
+ (char-to-num
+ (aref (downcase
+ (org-icompleting-read
+ "X pos: "
+ (mapcar #'string
+ (mapcar #'num-to-char (range 1 *size*)))))
+ 0))
+ (1- (string-to-number
+ (org-icompleting-read
+ "Y pos: "
+ (mapcar #'number-to-string (range 1 *size*))))))))
(message "move: %S" pos))
(defun sgf-board-act-resign ()
@@ -255,10 +253,8 @@
;;; Display mode
(defvar sgf-board-mode-map
(let ((map (make-sparse-keymap)))
- (define-key map (kbd "<right>") 'right)
- (define-key map (kbd "<left>") 'left)
- (define-key map (kbd "<up>") 'up)
- (define-key map (kbd "<down>") 'down)
+ (define-key map (kbd "<right>") 'sgf-board-next)
+ (define-key map (kbd "<left>") 'sgf-board-prev)
(define-key map (kbd "q") (lambda () (interactive)
(kill-buffer (current-buffer))))
map)
@@ -267,4 +263,24 @@
(define-derived-mode sgf-board-mode nil "SGF"
"Major mode for editing text written for viewing SGF files.")
+(defun sgf-board-next (&optional count)
+ (interactive "p")
+ (dotimes (n (or count 1) (or count 1))
+ (let ((board (pieces-to-board (car *history*) *size*))
+ (move (sgf<-move (car *back-ends*))))
+ (if move
+ (push (board-to-pieces
+ (apply-moves (clear-labels board) move))
+ *history*)
+ (error "sgf-board: no more moves"))
+ (update-display (current-buffer)))))
+
+(defun sgf-board-prev (&optional count)
+ (interactive "p")
+ (dotimes (n (or count 1) (or count 1))
+ (message "index:" (index (car *back-ends*)))
+ (sgf->undo (car *back-ends*))
+ (pop *history*)
+ (update-display (current-buffer))))
+
(provide 'sgf-board)
diff --git a/sgf-tests.el b/sgf-tests.el
index e3378fc..761bc01 100644
--- a/sgf-tests.el
+++ b/sgf-tests.el
@@ -30,6 +30,8 @@
(require 'sgf2el)
(require 'sgf-board)
(require 'sgf-gtp)
+(require 'sgf-gnugo)
+(require 'sgf)
(require 'ert)
@@ -148,21 +150,17 @@
(should (= 4 (length (neighbors board (/ (length board) 2)))))
(should (= 3 (length (neighbors board 1))))))
-(defun stone-counts ()
- (cons (stones-for (car *history*) :B)
- (stones-for (car *history*) :W)))
-
;;; GTP and gnugo tests
(ert-deftest sgf-test-sgf-gtp-char-to-gtp ()
- (should (= 1 (sgf-gtp-char-to-gtp ?A)))
- (should (= 8 (sgf-gtp-char-to-gtp ?H)))
- (should (= 9 (sgf-gtp-char-to-gtp ?J)))
- (should (= 19 (sgf-gtp-char-to-gtp ?T)))
- (should (= 1 (sgf-gtp-char-to-gtp ?a)))
- (should (= 8 (sgf-gtp-char-to-gtp ?h)))
- (should (= 9 (sgf-gtp-char-to-gtp ?j)))
- (should (= 19 (sgf-gtp-char-to-gtp ?t))))
+ (should (= 1 (sgf-gtp-char-to-pos ?A)))
+ (should (= 8 (sgf-gtp-char-to-pos ?H)))
+ (should (= 9 (sgf-gtp-char-to-pos ?J)))
+ (should (= 19 (sgf-gtp-char-to-pos ?T)))
+ (should (= 1 (sgf-gtp-char-to-pos ?a)))
+ (should (= 8 (sgf-gtp-char-to-pos ?h)))
+ (should (= 9 (sgf-gtp-char-to-pos ?j)))
+ (should (= 19 (sgf-gtp-char-to-pos ?t))))
(defmacro with-gnugo (&rest body)
`(let (*gnugo*)
@@ -228,7 +226,7 @@
(with-gnugo
(should (string= b1 (gtp-command *gnugo* "showboard")))
(should (string= "" (gtp-command *gnugo* "black A1")))
- (should (string= "" (sgf->move *gnugo* '(:B :pos . (0 . 1)))))
+ (should (string= "" (sgf->move *gnugo* '(:B :pos . (0 . 1)))))
(should (string= b2 (gtp-command *gnugo* "showboard"))))))
@@ -237,10 +235,18 @@
(declare (indent 1))
`(let (*sgf*)
(progn
- (setf *sgf* (make-instance 'sgf))
- (setf (self *sgf*) (sgf2el-file-to-el ,file))
+ (setf *sgf* (make-instance 'sgf
+ :self (sgf2el-file-to-el ,file)
+ :index '(0)))
,@body)))
+(ert-deftest sgf-parse-empty-properties ()
+ (with-sgf-from-file "sgf-files/w-empty-properties.sgf"
+ (should (remove-if-not (lambda (prop)
+ (let ((val (cdr prop)))
+ (and (sequencep val) (= 0 (length val)))))
+ (root *sgf*)))))
+
(ert-deftest sgf-test-sgf-class-creation ()
(with-sgf-from-file "sgf-files/jp-ming-5.sgf"
(should (tree-equal (index *sgf*) '(0)))
@@ -250,53 +256,52 @@
;;; SGF and board tests
-(defmacro with-sgf-file (file &rest body)
+(defmacro with-sgf-display (file &rest body)
(declare (indent 1))
- `(let (*sgf* buffer)
- (unwind-protect
- (progn
- (setf *sgf* (make-instance 'sgf))
- (setf (self *sgf*) (sgf2el-file-to-el ,file))
- (setf buffer (sgf-board-display *sgf*))
- (with-current-buffer buffer ,@body))
- (should (kill-buffer buffer)))))
+ (let ((buffer (gensym "sgf-display-buffer")))
+ `(let ((,buffer (sgf-board-display
+ (make-instance 'sgf
+ :self (sgf2el-file-to-el ,file)
+ :index '(0)))))
+ (unwind-protect (with-current-buffer ,buffer ,@body)
+ (should (kill-buffer ,buffer))))))
(def-edebug-spec parse-many (file body))
(ert-deftest sgf-display-fresh-sgf-buffer ()
- (with-sgf-file "sgf-files/3-4-joseki.sgf"
+ (with-sgf-display "sgf-files/3-4-joseki.sgf"
(should *history*)
(should *back-ends*)))
(ert-deftest sgf-independent-points-properties ()
- (with-sgf-file "sgf-files/3-4-joseki.sgf"
- (let ((points-length (length (assoc :points (sgf-ref sgf '(0))))))
- (right 4)
- (should (= points-length
- (length (assoc :points (sgf-ref sgf '(0)))))))))
+ (with-sgf-display "sgf-files/3-4-joseki.sgf"
+ (sgf-board-next 4)
+ (should (not (tree-equal (car *history*) (car (last *history*)))))))
+
+(defun stone-counts ()
+ (let ((pieces (car sgf-board-history)))
+ (flet ((count-for (color) (length (remove-if-not
+ (lambda (piece) (equal color (car
piece)))
+ pieces))))
+ (cons (count-for :B) (count-for :W)))))
(ert-deftest sgf-singl-stone-capture ()
- (with-sgf-file "sgf-files/1-capture.sgf"
- (right 3) (should (tree-equal (stone-counts) '(2 . 0)))))
+ (with-sgf-display "sgf-files/1-capture.sgf"
+ (sgf-board-next 3) (should (tree-equal (stone-counts) '(2 . 0)))))
(ert-deftest sgf-remove-dead-stone-ko ()
- (with-sgf-file "sgf-files/ko.sgf"
- (should (tree-equal (stone-counts) '(0 . 0))) (right 1)
- (should (tree-equal (stone-counts) '(1 . 0))) (right 1)
- (should (tree-equal (stone-counts) '(1 . 1))) (right 1)
- (should (tree-equal (stone-counts) '(2 . 1))) (right 1)
- (should (tree-equal (stone-counts) '(2 . 2))) (right 1)
- (should (tree-equal (stone-counts) '(3 . 2))) (right 1)
- (should (tree-equal (stone-counts) '(2 . 3))) (right 1)
- (should (tree-equal (stone-counts) '(3 . 2))) (right 1)
+ (with-sgf-display "sgf-files/ko.sgf"
+ (should (tree-equal (stone-counts) '(0 . 0))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(1 . 0))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(1 . 1))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(2 . 1))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(2 . 2))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(3 . 2))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(2 . 3))) (sgf-board-next)
+ (should (tree-equal (stone-counts) '(3 . 2))) (sgf-board-next)
(should (tree-equal (stone-counts) '(2 . 3)))))
(ert-deftest sgf-two-stone-capture ()
- (with-sgf-file "sgf-files/2-capture.sgf"
- (right 8) (should (tree-equal (stone-counts) '(6 . 0)))))
+ (with-sgf-display "sgf-files/2-capture.sgf"
+ (sgf-board-next 8) (should (tree-equal (stone-counts) '(6 . 0)))))
-(ert-deftest sgf-parse-empty-properties ()
- (with-sgf-file "sgf-files/w-empty-properties.sgf"
- (should (remove-if-not (lambda (prop)
- (let ((val (cdr prop)))
- (and (sequencep val) (= 0 (length val)))))
- (car sgf)))))
+(provide 'sgf-tests)
diff --git a/sgf-trans.el b/sgf-trans.el
index 416fb2c..a8b9ace 100644
--- a/sgf-trans.el
+++ b/sgf-trans.el
@@ -40,7 +40,7 @@
(defgeneric sgf->move (back-end move) "Send MOVE to BACK-END.")
(defgeneric sgf->board (back-end size) "Send SIZE to BACK-END.")
(defgeneric sgf->resign (back-end resign) "Send RESIGN to BACK-END.")
-(defgeneric sgf->undo (back-end undo) "Send UNDO to BACK-END.")
+(defgeneric sgf->undo (back-end) "Tell BACK-END undo the last
move.")
(defgeneric sgf->comment (back-end comment) "Send COMMENT to BACK-END.")
(defgeneric sgf<-size (back-end) "Get size from BACK-END")
(defgeneric sgf<-name (back-end) "Get a game name from BACK-END.")
diff --git a/sgf.el b/sgf.el
index 1b18b2c..9756110 100644
--- a/sgf.el
+++ b/sgf.el
@@ -74,7 +74,7 @@
(defmethod sgf->resign ((sgf sgf) resign))
-(defmethod sgf->undo ((sgf sgf) undo)
+(defmethod sgf->undo ((sgf sgf))
(decf (car (last (index sgf))))
(alistp (current sgf)))
@@ -94,9 +94,13 @@
(defmethod sgf<-move ((sgf sgf))
(incf (car (last (index sgf))))
- (alistp (current sgf)))
+ (current sgf))
(defmethod sgf<-comment ((sgf sgf))
(aget (current sgf) :C))
+(defun sgf-from-file (file)
+ (interactive "f")
+ (make-instance 'sgf :self (sgf2el-file-to-el file)))
+
(provide 'sgf)
- [elpa] 79/255: communicating with gnugo through gtp generics, (continued)
- [elpa] 79/255: communicating with gnugo through gtp generics, Eric Schulte, 2014/03/15
- [elpa] 77/255: saner requirement dependency graph, Eric Schulte, 2014/03/15
- [elpa] 81/255: normalization, Eric Schulte, 2014/03/15
- [elpa] 80/255: splitting the sgf back end from the board interface, Eric Schulte, 2014/03/15
- [elpa] 84/255: more transition, Eric Schulte, 2014/03/15
- [elpa] 82/255: organization, Eric Schulte, 2014/03/15
- [elpa] 88/255: made the *back-ends* variable singular, Eric Schulte, 2014/03/15
- [elpa] 57/255: splitting sgf.el into board test and utility files, Eric Schulte, 2014/03/15
- [elpa] 87/255: removed old variable, Eric Schulte, 2014/03/15
- [elpa] 83/255: starting to transition to generic board interface, Eric Schulte, 2014/03/15
- [elpa] 85/255: working with new set less some state-leak issues,
Eric Schulte <=
- [elpa] 90/255: moving around major mode and key bindings, Eric Schulte, 2014/03/15
- [elpa] 91/255: adding properties to the board string, Eric Schulte, 2014/03/15
- [elpa] 86/255: playing gnugo, Eric Schulte, 2014/03/15
- [elpa] 94/255: remove old variable from tests, Eric Schulte, 2014/03/15
- [elpa] 92/255: worked around stupid bug in mapconcat, Eric Schulte, 2014/03/15
- [elpa] 93/255: able to play against gnugo, Eric Schulte, 2014/03/15
- [elpa] 95/255: renaming files for go- prefix, Eric Schulte, 2014/03/15
- [elpa] 98/255: *trackers* are multiple subordinate back-ends, Eric Schulte, 2014/03/15
- [elpa] 89/255: tweaks, Eric Schulte, 2014/03/15
- [elpa] 102/255: simpler name for main go-board function, Eric Schulte, 2014/03/15