在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)