2014年3月2日日曜日

[OCaml]Life gameを作ってみた

ここ数日、プログラミングHaskell を読んでいる。
この本には、対話プログラムの例題としてライフゲームが載っているのだけど、
OCamlでは、どんなになるかなーと思い、書いてみた。

昨年の年末から年始にかけて、プログラミングの基礎 (Computer Science Library) を読んで、OCamlで基本的な処理は書けるようになったのだけど、それから2ヶ月の間、全く使っていなかったら、いろいろと忘れていた。やっぱり、言語は使っていないと忘れてしまって駄目だなぁ。

コードは こちら(https://github.com/takeisa/ocaml-lifegame.git) から。
Coreライブラリを使っている。
opamでcoreをインストールして、
$ corebuild life_game.native
とすれば実行ファイルができる。

実行例

途中で止めた時のスクリーンショット。
「*」が生きているセル。
ライフゲームを知らない人は、何だか良く分からない実行結果ですね。


OCamlでコードを書いて思ったこと

・Haskellにある (.) ($) は便利だな。自分で定義すれば良いのだけど、OCamlにも欲しい。
・Screenモジュールで 座標を表わす pos_t型を以下のように定義し、
type pos_t = {x: int; y: int}
シグネチャでは、
type pos_t
として、中身を非公開にした。
しかし、程度のプログラムでは、int * intのタプルそのままで座標を管理する方がコードは簡単になったかもしれない。
・コードの編集時には、Emacs tuareg-modeはとても便利。
でも、ソースをモジュール分割した場合、そのモジュールを認識させるためには、いちいちコンパイルしなければならず、面倒だった。何か良い方法があるのかな?
・OCamlでは簡単に副作用があるコードをどこでも気軽に書けるので、便利と言えば便利なのだけど、気を付けないと、純粋なコードと副作用があるコードが混在しやすそう。
・OCamlはHaskellみたいに、関数の直前に型定義を書けないのかな?シグネチャを分けて書くの面倒だなぁ。
・HaskellよりOCamlの方がコードは若干は冗長になった。これは書き方が悪いか...
・厳密な型チェックは、型に関連するバグが出ないので、やっぱり便利。
・あたりまえだけど、この程度のプログラムではHaskellもOCamlも、あまり変わらない。
・文字出力後、画面を更新する際は、flush stdout を忘れずに。
・HaskellもOCamlもコードを書いていて楽しいので、他にも書いてみよう。
・ライブラリを把握していないので、実装に時間がかかるし、車輪の再発明をしがち。
Cheat sheetは便利。

参考