SCHEMEON.jsのdo文のバグ(ていうかdo文の意味を勘違いしていた)
Schemeではdoマクロは再帰に展開されるので、繰り返し変数は繰り返しの度に新たに作られます。繰り返しが進んでも、一度クロージャで取り込んだ値は変わりません。
(do ((x 0 (+ x 1)) (r '() (lambda () x))) ((= x 1) (r)) ) ;=> 0 ;; (lambda () x)が閉じ込めるxはx=0の時のxで、x=1になるxとは別CLではこうなります。
(do ((x 0 (+ x 1)) (r '() (lambda () x))) ((= x 1) (funcall r)) ) ;=> 1 ;; (lambda () x)が閉じ込めるxが繰り返しによって上書きされx=1になっている繰り返し変数のその時の値を捕捉したい場合は、(let ( (x x) ) (lambda () x))などとする必要があります。
http://tips.lisp-users.org/common-lisp/index.cgi?Scheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%8cCommon%20Lisp%e3%81%a7%e3%83%8f%e3%83%9e%e3%82%8a%e3%81%9d%e3%81%86%e3%81%aa%e3%81%a8%e3%81%93%e3%82%8d
まずい完全にdo文の挙動を勘違いしていた。前もそんな間違いしたかも。
そうかそうなのか。x上書きしてたよ。
ていうかそもそも、うちのSCHEMEON.jsは、空のbodyを受け付けないし。
改修が必要。いずれ。
ほかにもたんまりバグがあるのです。