SParser-2.1 released

http://fhuman.esys.tsukuba.ac.jp/~nozom/SParser-2.1.zip

変更点は、

  • 終端文脈で無駄な継続を生成しないようにした
  • read, writeを実装した
  • 有理数(分数)に対応した
  • GUIに入力履歴が付いて若干使いやすくなった
  • その他バグ修正多数

例によってドキュメントも何もない(コメントもほとんどない)ので、読みたい人は気合いで調べてほしい。

末尾呼び出しの最適化を含む、コンパイルの仕組みを考えていたがどうにも良いアイデアが浮かばない。今の実装だと、1000回の繰り返しがあると結果的に1000個のパラメータが違うだけの継続を作ることになるので、インタプリタ形式ならともかくコンパイラ方式ではこれはまずい(インタプリタ形式の場合、生成するそばから消費するので、call/ccを使わなければアクティブな継続は関数呼び出しの深さに比例する)。まともにやるなら、まず全体を継続渡し形式(CPS; Continuation Passing Style)に変換してやるんだろうけど、こんなのJavaで書きたくない。それこそSchemeで書きたいので、じゃあコンパイラSchemeレベルで実装するか? でもコンパイル処理はSchemeの世界だけでは完結できないので、最終的には絶対にJavaで書かないといけない部分はあるだろうし、そうなるとインタフェースをどこで取るか悩みどころ。