OCaml格式和结构框:为什么我的输出与示例不匹配?

md5*_*d5i 6 io ocaml

在OCaml网站上的" 使用格式模块"页面上有一个示例,它提供了结构和打包hov框之间差异的示例.我试图复制这个例子.(我使用的是OCaml 3.12.1.)

通过以下输入:

Format.printf "@[<hov 2>(---@\n@[<hov 2>(---@\n@[<hov 2>(---@,)@]@,)@]@,)@]@\n"
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出:

(---
  (---
    (---)))
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是如何将页面输出归结为"结构框":

(---
  (---
    (---
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

我不确定哪个Format.printf标识符映射到这些框,所以我尝试了几种变体:

Format.printf "@[<hv 2>(---@\n@[<hv 2>(---@\n@[<hv 2>(---@,)@]@,)@]@,)@]@\n"
Format.printf "@[<2>(---@\n@[<2>(---@\n@[<2>(---@,)@]@,)@]@,)@]@\n"
Format.printf "@[<b 2>(---@\n@[<b 2>(---@\n@[<b 2>(---@,)@]@,)@]@,)@]@\n"
Run Code Online (Sandbox Code Playgroud)

但是上面的所有内容都给出了与<hov 2>初始示例相同的输出.有人会有任何想法如何从网页获得类似于第二个例子的输出?

小智 7

我本以为你的第二个例子(带有hv盒子)应该可行.但似乎@ \n没有我们期望的行为.

解决方案1:在右括号之前强制换行,即用@ \n替换@.

let () =
  Format.printf "@.";
  Format.printf "@[<hov 2>(---@\n@[<hov 2>(---@\n@[<hov 2>(---@\n)@]@\n)@]@\n)@]@\n";
  Format.printf "@."
Run Code Online (Sandbox Code Playgroud)

结果:

(---
  (---
    (---
      )
    )
  )
Run Code Online (Sandbox Code Playgroud)

问题:总会有换行符,它永远不会打印:

(---(---(---)))

即使它有空间.如果这对您来说是个问题,请参阅解决方案2.

解决方案2:使用更长的行:)如果中断是由长行引起的,则hv框会在右括号之前断行.

let () =
  Format.printf "@.";
  Format.printf "@[<hv 2>(------------------------------------------------------------------------@,@[<hv 2>(---@,@[<hv 2>(---@,)@]@,)@]@,)@]";
  Format.printf "@."
Run Code Online (Sandbox Code Playgroud)

结果:

(------------------------------------------------------------------------
  (---(---))
  )
Run Code Online (Sandbox Code Playgroud)

但是,右括号不与开头括号对齐.

解决方案3:如果您希望右括号与左侧对齐,则需要两个方框.

let () =
  Format.printf "@.";
  Format.printf
    "@[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @]@,)@]@]@,)@]@]@,)@]";
  Format.printf "@."
Run Code Online (Sandbox Code Playgroud)

结果:

(------------------------------------------------------------------------
  (------------------------------------------------------------------------
    (------------------------------------------------------------------------
    )
  )
)
Run Code Online (Sandbox Code Playgroud)