Arantium Maestum

プログラミング、囲碁、読書の話題

OCamlで48 Hour Schemeをやってみる その3 (第四章、五章)

第四章:エラーハンドリング

第四章の主眼はエラーハンドリング。

Haskellだとモナドでやるのが正しい作法なようで、型チェックの恩恵に与れる。その反面、一章を割いていろんな関数の実装と型注釈を変更していく必要がある。

OCamlだと例外を投げればいいので楽。

github.com

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

他のモジュールで投げるだけ。今のところは「捉えて解釈してより有用なエラーメッセージを出力する」みたいなことはしていない。

第五章:機能追加

第五章では新たにいろいろと機能を追加していく。

github.com

=, <, >, &&, ||などの二項演算子ifによる条件分岐、car, cdr, consなどのリスト処理関数、そして比較演算子eq?, eqv? equal?などを実装した。

ついでに細々とした実装の間違いが発覚したので、それも修正:

  • '(a b c)(quote a b c)とパースしていたのを(quote (a b c))になるように変更
  • "abc"といった文字列をString "\"abc\""とパースしていたのをString "abc"になるように変更

細かい修正はコミットログを見てもらえばわかるが、比較的簡単に機能が追加できるのは嬉しい。

次章はREPLを追加する話。