OCamlでインタプリタを書いた

成果物

github.com

 

なぜ書いたか

読書記録にはまだ載せていないが10月ごろにGo言語でつくるインタプリタを読んで、使いたくてなかなか使えていないOCamlの練習がてらにOCamlで実装した。

 

書いてみてOCamlの勉強にもなったけれど、どちらかというと本の内容を再咀嚼するのにとても役立った。本のGoのコード自体を一応写経していたけれどOCamlに書き直すタイミングで、「あれ、これなんでこうなってるんだっけ?」というような部分が多々見つかったのでわかったようでわかっていなかった部分が潰せたと思う。特にEvaluatorについては処理のフローがあまり理解できていなかったし、マクロは書き直すまで何もわかっていなかったなと振り返ると思う。

 

github.com

 

OCamlに関しては、OCaml自体が書きやすく、Goの手続的なコードを割とそのまま書けてしまうためか、OCamlらしさのあるコードにはあまりなっていない。特にEvaluatorのところで相互再帰関数が長々と続いているところはかなり読みづらくなっていて、どうにかしたい。パフォーマンス的なこともあまり気にせず書いたこともあり、どこかで大きなリファクタリングはしたい。

OCaml自体は書いていてとても楽しい言語だった。型推論がしっかりしているので、固いコードの割に必要なコード量は少なくて良いし、コンパイラのチェックで全ての型のパターンを処理しなければいけないのもコーディング中に意図がまとまって良い。処理を細かい関数に閉じ込めて責務を分担させるとコード自体も読みやすくなるというのは、他の言語でコードを書いているときにも意識したい発見だった。本当に書きやすいのでちょっとしたCLIとか書くのにも良さそうだと思う。

 

実装を終えた後に、今回のインタプリタで動くMonkey言語の他言語実装を紹介している著者の方のサイトがあり、載せてもらった。

monkeylang.org

 

 

エンジニアを始めてから、社外の人が見るような形でコードのアウトプットをするのがほぼ初めてだったが、コードを書く際の意識も変わってくるので、どんどん外向きのアウトプットをしていきたい。