6

OCaml Web サイトのUsing the Format モジュールページに、構造的な hov ボックスとパッキング 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>ただし、上記のすべては、最初の例と同じ出力を提供します。Web ページから 2 番目の例のような出力を取得する方法を知っている人はいますか?

4

1 に答える 1

7

あなたの2番目の例(hvボックスを使用)はうまくいくはずだと思っていたでしょう。しかし、@\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:右括弧を左括弧と揃えるには、2 つのボックスが必要です。

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

結果:

(------------------------------------------------------------------------
  (------------------------------------------------------------------------
    (------------------------------------------------------------------------
    )
  )
)
于 2012-09-25T09:44:29.213 に答える