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を受け付けないし。
改修が必要。いずれ。
ほかにもたんまりバグがあるのです。