Как мне использовать функции симпатичного принтера Sexplib Джейн Стрит?

Я новый ученик OCaml, и я пытаюсь напечатать некоторые S-выражения, используя Sexplib Джейн Стрит (входит в состав Core):

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 ценится! (Кроме того, рад слышать, если это супер-unidiomatic, и я просто делаю это неправильно)

1 ответ

Решение

Вам нужно очистить форматер, например,

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 ()

Кроме того, вы можете использовать %! Спецификатор формата для сброса непосредственно в спецификации формата.

С библиотекой формата у нас есть дополнительный уровень буферизации. Последующие отпечатки в форматтер накапливаются в нем и стираются при определенных условиях. Перед сбросом данные форматируются в соответствии со спецификацией, затем они печатаются в канал (который может сбрасывать данные на основе собственных критериев), после того, как все записанные данные окончательно сбрасываются, чтобы убедиться, что все выводится на устройство., связанные с каналом.

Другие вопросы по тегам