我正在尝试使用OCaml的Format模块来打印一些结构。根据{{3}},我只需要使用框并指定适合拥有新行的断点。但是,我无法正确缩进。
例如:
# open Format;;
# fprintf std_formatter "bar = foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk@])";;
bar = foo(
lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)
- : unit = ()
然而,我期待得到:
bar = foo(lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)
如何让它正确地缩进参数?
答案 0 :(得分:2)
我无法复制。我明白了:
# Format.fprintf Format.std_formatter "bar = foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])";;
bar = foo(lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk,
aze: azeioajze)- : unit = ()
预期。打开一个框不会导致剪切,所以如果你想在foo(
之后换行,你应该写@[<hv>@,
。
答案 1 :(得分:1)
如果我没有弄错,问题的根源是最大缩进限制;如果您的代码以Format.set_margin 20
开头,那么它的副作用也是将最大缩进限制设置为10.
这意味着应该使用大于10的缩进打开的框被推到一个新行,并以0缩进打开。
换句话说,
Format.set_margin 20;;
Format.printf "bar = foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;
的产率:
bar = foo(
lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)
设置边距后将最大缩进限制设置为11可以部分解决问题:
Format.set_margin 20; Format.set_max_indent 11;
Format.printf "bar = foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;
产量
bar = foo(lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)
换句话说,hv
框被打开而不需要换行;但压痕没有增加。
将max_indent设置为12到18之间的值
Format.set_margin 20; Format.set_max_indent 12;
Format.printf "bar = foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;
完全解决了这个问题:
bar = foo(lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)
此处的外卖消息可能是您应该同时设置保证金和最大缩进限制(以及此顺序)。