もう!
ちょっとした深さ優先で探索するプログラムを書いたんですよ。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とか再帰が書きやすい言語を使ってたからなのかも、とか思いました。もうちょっと謙虚になろう。