使用漂亮的打印机写一个to_string函数

Use a pretty printer to write a to_string function

我在大字体 t 上定义了一个漂亮的大打印机 pp: out_channel -> t -> unit。因此,我可以像 Printf.fprintf stdout "%a" x where x: t 那样使用它,或者像 Printf.fprintf chan "%a" pp x where chan: out_channel.

这样的链式打印

现在我需要将打印的内容转换为字符串或文本。有谁知道是否有办法 leverage/use 函数 pp 而不是从头开始编写函数 to_string: t -> unit

Format.asprintf 应该适合您的需要,如果您 pp 是针对 Format.formatter 类型而不是 out_channel 实现的。 Format.formatter 是一个更通用的类型,应该优先于具体的 out_channel。事实上,漂亮打印机的一种标准类型是 Format.formatter -> 'a -> unit 类型,至少 OCaml 顶层、调试器和其他工具中的 #install_printer 指令需要它。 Core 库中使用相同类型的函数来实现 Pretty_printer 接口。

因此,如果您要重新实现 pp 函数以与 Format 模块一起使用(通常为此,仅 open Format 模块就足够了),那么您可以重用它。打印到 out_channel 模块的函数无法重定向以打印到字符串中。所以还是不写为好。

要完成这项工作,您需要一些在 OCaml 中看起来像输出通道的东西,但将数据保存在字符串(或缓冲区)中。不幸的是,OCaml 中没有这样的东西。