ディレクトリ内ファイルの取得

let readdir path = 
  let result = ref [] 
  and dir = Unix.opendir path in
  let _ = 
    try
      while (true) do
	result := (Unix.readdir dir)::(!result);
      done
    with End_of_file -> () 
  in
    Unix.closedir dir;
    ! result;;

なんだコレ。ほんとに関数型言語か?破壊的代入に例外を使った大域脱出、さらには再帰じゃなくてループを使ってる。
いや、まあ書いたのは俺なんだけどさ。なんか美しくない。
たぶん、用意されている関数が低レベルすぎるのが原因だ、うん。逆を言えば、haskellとかだったらCでラッパを書くべき部分だ、たぶん。