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

How do I use Jane Street's Sexplib's pretty-printer functions?

我是 OCaml 新手,我正在尝试使用 Jane Street 的 Sexplib(包含在核心中)打印一些 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 专业知识! (另外,很高兴听到这是否是超级单一的,我只是做错了)

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

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 库,我们就有了一层额外的缓冲。格式化程序的后续打印在其中累积,并在特定条件下被刷新。在flushing发生之前,数据按照规范进行格式化,然后打印到channel中(可能会根据自己的标准flush data),写完数据最后flush,以确保所有内容都输出到设备中, 与频道相关联。