read が動くようになった

Scheme の read はオブジェクトの外部表現を読み込んで返す。
例えば

(eval (read port) (scheme-report-environment 5))

こんな感じで使う。
read で返されたS式を eval して使う。


read は port から1文字ずつデータを読んでS式としてデータ1つ分を返すので

を内包している。


通常の Scheme 処理系であれば port からの read => それを eval という繰り返しで

  • ユーザーの入力(stdin)
  • ファイルからの入力

に対応しているのだけど、僕が作っている処理系は僕が read の存在に気づかなかったのと外部表現への理解の浅さが原因でうまい作りになっていませんでした。
これを改善すべく read 用に Parser を書き直していたのが今日の作業。


今回の Parser は

  • BNF をちゃんと読んでから実装した
  • 字句解析/構文解析の2フェーズ用にそれぞれ YAML で簡単にテストを書ける仕組みをつくった

ので、わりときれいで堅い実装になっていると思われる。


read が実装できたので slib 動作に挑戦を再開したところ。
slib:report までは正常に動くようになっていることが分かった。


明日は

  • slib の続き
  • 処理系内のオブジェクト配列 => Pair の変換を簡単に行えるユーティリティの実装
  • Parser を全て read のやつに切替えてテストを全てパスする

というのをやりたい。