ttn pushed a commit to branch master in repository elpa. commit 6660bd425070bd3049808d5e5900b247cdf56822 Author: Thien-Thi Nguyen <t...@gnu.org> Date: Fri Mar 14 09:05:22 2014 +0100
[gnugo sgf] Fix bug: Output subtrees correctly. Long-standing -- from inception -- omission. * packages/gnugo/gnugo.el (gnugo/sgf-write-file >>tree): Don't assume all elements of a tree are nodes; instead, handle nodes as before, and recurse on trailing subtree elems. --- packages/gnugo/NEWS | 1 + packages/gnugo/gnugo.el | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/gnugo/NEWS b/packages/gnugo/NEWS index fbfec3b..7ca102b 100644 --- a/packages/gnugo/NEWS +++ b/packages/gnugo/NEWS @@ -11,6 +11,7 @@ Hint: (highlight-phrase "[0-9][.][0-9][.][0-9]+\\|[0-9]+[.][.][0-9]+" - next | NOT YET RELEASED - bugfixes - don't special-case property value type ‘none’ + - handle subtrees on write - new keybinding for ‘gnugo-undo-one-move’: M-u - ‘gnugo-undo-one-move’ can optionally switch colors - performance improvements diff --git a/packages/gnugo/gnugo.el b/packages/gnugo/gnugo.el index 02fe4e3..39531e9 100644 --- a/packages/gnugo/gnugo.el +++ b/packages/gnugo/gnugo.el @@ -2155,6 +2155,7 @@ starting a new one. See `gnugo-board-mode' documentation for more info." ;; hmm ;; ‘append’ => ([NODE...] [SUBTREE...]) ;; ‘cons’ => (([NODE...]) . [SUBTREE...]) + ;; see consequent hair in -write-file (append ;; nodes (loop while (seek ?\;) @@ -2224,8 +2225,21 @@ starting a new one. See `gnugo-board-mode' documentation for more info." (unless (zerop (current-column)) (newline)) (insert "(") - (dolist (node tree) - (>>node node)) + ;; The IR (see "hmm" above) prioritizes space + ;; efficiency; no cost if no subtrees (common case). + ;; The downside, however, is that subtree access + ;; requires this somewhat-funky border search. + (let (x subtrees) + (while (setq x (pop tree)) + (if (symbolp (caar x)) + (>>node x) + (setq + ;; Add back the first subtree. + subtrees (cons x tree) + ;; Arrange to stop searching. + tree nil))) + (dolist (sub subtrees) + (>>tree sub))) (insert ")"))) (with-temp-buffer (dolist (tree collection)