OCamlで48 Hour Schemeをやってみる その3 (第四章、五章)
第四章:エラーハンドリング
第四章の主眼はエラーハンドリング。
Haskellだとモナドでやるのが正しい作法なようで、型チェックの恩恵に与れる。その反面、一章を割いていろんな関数の実装と型注釈を変更していく必要がある。
OCamlだと例外を投げればいいので楽。
Exceptionsモジュールで使ういろんなエラーを定義して:
exception NumArgs of int * string exception TypeMismatch of string * string exception LexingFail of string exception BadSpecialForm of string * string exception NotFunction of string * string exception UnboundVar of string * string exception Default of string
他のモジュールで投げるだけ。今のところは「捉えて解釈してより有用なエラーメッセージを出力する」みたいなことはしていない。
第五章:機能追加
第五章では新たにいろいろと機能を追加していく。
=, <, >, &&, ||などの二項演算子、ifによる条件分岐、car, cdr, consなどのリスト処理関数、そして比較演算子eq?, eqv? equal?などを実装した。
ついでに細々とした実装の間違いが発覚したので、それも修正:
'(a b c)を(quote a b c)とパースしていたのを(quote (a b c))になるように変更"abc"といった文字列をString "\"abc\""とパースしていたのをString "abc"になるように変更
細かい修正はコミットログを見てもらえばわかるが、比較的簡単に機能が追加できるのは嬉しい。
次章はREPLを追加する話。