我是一名新的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专有技术! (另外,很高兴听到这是非常单一的,我只是做错了)
答案 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库,我们有一层额外的缓冲。随后对格式化程序的打印在其中累积并在某些条件下刷新。在进行刷新之前,根据规范对数据进行格式化,然后将其打印到通道中(可以根据自己的标准刷新数据),在写完所有内容后,最后刷新数据,以确保所有内容都输出到设备中,与频道相关联。