Formatモジュール

まあ、マニュアルを読めばわかる。

自分で実装してみようと思って、よくわからなくなったので、ちゃんと動作を調べてみた。

# open Format;;
# set_margin 5;;
# printf "@[<hv>1@,@[<v>2@,3@,4@,5@]@]";;
# printf "@[<hv>1@,@[<v>2@,3@,4@]@]";;

この二つのprintfはどうなるかが問題。

回答。

# printf "@[<hv>1@,@[<v>2@,3@,4@,5@]@]";;
1
2
3
4
5- :
 unit
 =
 ()
# printf "@[<hv>1@,@[<v>2@,3@,4@]@]";;
12
 3
 4- :
 unit
 =
 ()

一つ目は、2〜5のBoxがv boxなので、必ず幅は1になる。そのため、1の後では改行しなくても良い。ところが、実際には改行されているので、内部で今後の出力の幅を、何らかの「boxを考慮しない方法で見積もっている」ことになる。試していくと、二つ目のboxの中身が4文字なら大丈夫だったので、リテラルの文字数を見てるのかな?*1

ちょっとがっかりな気もしないでもないが、「OCamlのFormatみたいの」を実装するには楽か。

*1:あー一応ソースも見てみたんですけど、さっぱりでした。