もう!

ちょっとした深さ優先で探索するプログラムを書いたんですよ。OCamlだとこんな感じ。

let rec is_updated memo file =
  if Hashtbl.mem memo file then
    Hashtbl.find memo file
  else
    let updated = List.exists (is_updated memo) (file#depends()) && file#updated() in
      Hashtbl.add memo file updated;
      updated

要するにインクリメンタルにコンパイルしたかっただけなんですけど。いちいちフィアルの依存関係を辿ると遅いので、キャッシュしてみたわけです。

ところが、これをJavaでやったらハマるわけです。信じられない。一番いやらしかったのは、List.existsが無いところだと思う。これをforに展開して、一個変数を宣言して、それに|=とかなんとかやって、とかやってるうちにこんがらがってきて、実行したら止らなかった………orz

これまで再帰が分らない人とかバカじゃないの?とか思ってたですけど、JavaとかCだと難しいw。俺がこれまでサクサクプログラミングできてたのは、単純にMLとか再帰が書きやすい言語を使ってたからなのかも、とか思いました。もうちょっと謙虚になろう。