如何使用Jane Street的Sexplib的漂亮打印机功能?

时间:2017-10-03 19:51:54

标签: ocaml string-formatting s-expression ocaml-core

我是一名新的OCaml学习者,我试图使用Jane Street的Sexplib(包含在Core中)打印一些S表达式:

let rec print_source ?(channel = stdout) sexps =
   let formatter = Format.formatter_of_out_channel channel in
   Sexp.pp_hum formatter |> List.iter sexps

然而,这似乎并没有向stdout输出任何内容。如果我用非格式使用版本替换它,它可以正常工作:

let rec print_source ?(channel = stdout) sexps =
   Sexp.output_hum channel |> List.iter sexps

感谢任何OCaml专有技术! (另外,很高兴听到这是非常单一的,我只是做错了)

1 个答案:

答案 0 :(得分:2)

您需要刷新格式化程序,例如,

let rec print_source ?(channel = stdout) sexps =
   let formatter = Format.formatter_of_out_channel channel in
   Sexp.pp_hum formatter |> List.iter sexps;
   Format.pp_print_flush formatter ()

或者,您可以使用%!格式指定程序直接在您的格式规范中进行刷新。

使用Format库,我们有一层额外的缓冲。随后对格式化程序的打印在其中累积并在某些条件下刷新。在进行刷新之前,根据规范对数据进行格式化,然后将其打印到通道中(可以根据自己的标准刷新数据),在写完所有内容后,最后刷新数据,以确保所有内容都输出到设备中,与频道相关联。