6

在 OCaml 网站上的Using the Format module页面上有一个示例,它给出了结构和包装 hov 盒之间差异的示例。我试图复制这个例子。(我使用的是 OCaml 3.12.1。)

使用以下输入:

Format.printf "@[<hov 2>(---@\n@[<hov 2>(---@\n@[<hov 2>(---@,)@]@,)@]@,)@]@\n"

我得到了预期的输出:

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

我想不通的是如何获得页面归于“结构框”的输出:

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

我不确定哪个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"

<hov 2>但是以上所有内容都给出了与初始示例相同的输出。有人知道如何从网页获得类似于第二个示例的输出吗?

4

1 回答 1

7

我原以为您的第二个示例(带有高压盒)应该可以工作。但似乎@\n 没有我们期望的行为。

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

let () =
  Format.printf "@.";
  Format.printf "@[<hov 2>(---@\n@[<hov 2>(---@\n@[<hov 2>(---@\n)@]@\n)@]@\n)@]@\n";
  Format.printf "@."

结果:

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

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

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

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

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

let () =
  Format.printf "@.";
  Format.printf "@[<hv 2>(------------------------------------------------------------------------@,@[<hv 2>(---@,@[<hv 2>(---@,)@]@,)@]@,)@]";
  Format.printf "@."

结果:

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

但是,右括号与左括号不对齐。

解决方案3:如果要右括号与左括号对齐,则需要两个框。

let () =
  Format.printf "@.";
  Format.printf
    "@[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @]@,)@]@]@,)@]@]@,)@]";
  Format.printf "@."

结果:

(------------------------------------------------------------------------
  (------------------------------------------------------------------------
    (------------------------------------------------------------------------
    )
  )
)
于 2012-09-25T09:44:29.213 回答