在Format.fprintf中缩进框

时间:2016-02-08 16:56:48

标签: formatting format ocaml

请考虑函数f:

open Format

let rec f i = match i with
  | x when x <= 0 -> ()
  | i ->
    pp_open_hovbox std_formatter 2;
    printf "This is line %d@." i; 
    f (i-1);
    printf "This is line %d@." i; 
    close_box ();
    ()

它以递归方式打开hovbox并打印一些内容,然后是换行符提示符(@。)。当我调用f 3时,我获得以下输出:

This is line 3
This is line 2
This is line 1
This is line 1
This is line 2
This is line 3

但我期待:

This is line 3
  This is line 2
    This is line 1
    This is line 1
  This is line 2
This is line 3

你能解释为什么我获得第一个输出以及我需要改变以获得第二个输出吗?

2 个答案:

答案 0 :(得分:4)

@.不是新行提示,它相当于调用print_newlineprint_flush,它会关闭所有已打开的框,然后是新行。

如果您希望逐行打印Format,则应使用open_vbox打开一个垂直框,并在需要输出新内容时使用print_cut"@,")线。

答案 1 :(得分:2)

您应该使用@.指定程序而不是@\n。前者将刷新格式化程序并输出硬换行,实际上打破了漂亮的打印。它旨在用于文档的末尾,并且由于它实际上不是可组合的,我会警告不要使用它。

使用@\n,您将获得更接近您期望的输出:

This is line 3
  This is line 2
    This is line 1
      This is line 1
      This is line 2
    This is line 3

顺便说一下,使用vbox并发出@;好的中断提示可以获得相同的输出,这是更好的。