複数行REPL改

d:id:cadr:20080302の複数行REPLは続きの行を1行入力するたびに字句解析と構文解析をいちからやり直すというアレな実装であった。さすがのオレもこれは気に食わないので,ちょっと改良してみた。
目標は,入力された行に対して字句解析,構文解析は一度しか行わないようにすること。入力が途中で終わっているかどうかは構文解析で判定するのは前と同じ。
思いついた方針は,構文解析で入力トークンが空になったときにまだ構文解析の途中だった場合,その継続を投げる。新しく入力された行に対してその継続を適用すれば中断したところから構文解析を再開できる。
考え方は単純だ。が,実装は結構苦労した。自分の能力に絶望しつつ,さらに『龍が如く 見参!』に時間を費やしつつ,なんとか動くものができた。まだ気に食わない部分があるためもうしばらく構文解析についてやる予定。
今のところこんな感じ。怖いので変な入力は入れてない,正しい式のみ<-ダメじゃん。

*REPL0> runRepl
>> (+ 1 2)
3
>> (let 
.. ((x 1)
.. (y 2))
.. (+ x y))
3
>> (let ((x
.. 1) (
.. y
.. 2)) (+
.. x y))
3
>> (let ((x (call/cc call/cc))
..       ( y 2))
..    (if (number? x) x (x 10)))
10

しかし,これだけだと前との違いがわからんな。ソースも載っけないとか。