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:あー一応ソースも見てみたんですけど、さっぱりでした。