OCamlのprintf

デバッグ用のエラー出力をしたいという衝動に駆られると、Printfモジュールを使うことになるわけだが、残念ながらPrintf.printfはflushしてくれない。出力文字列に\nがあってもだめなんで、いちいち flush stderr; しないといけない。コレハメンドイ。
そこでflushしてくれるprintfを書こうとすると困ったことになる。

p_err f s =
  Printf.eprintf f s;
  flush stderr

これではダメ。引数を一つしかとれない。実際にはsじゃなくて、s1 s2 s3 ...かもしれない。それはformatによってきまる。かといって、p_err1, p_err2, ...を用意するのもイマイチ。じゃぁ、printfの定義はどうなってんのよと思ったら、こんな具合だ。

let fprintf chan fmt =
  ...

関数返すのかよ・・・。全部の引数を適用してからflushしないといけませんが、引数の数を特定できない。これはちと厳しそうだな。