Как захватить стандартный вывод js_of_ocaml toplevel - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть этот код js_of_ocaml, который принимает строку и выполняет ее (при условии, что строка является кодом OCaml):

let () = JsooTop.initialize ()

let execute code =
  let code = Js.to_string code in
  let buffer = Buffer.create 100 in
  let formatter = Format.formatter_of_buffer buffer in
  JsooTop.execute true formatter code;
  Js.string (Buffer.contents buffer)

(* Usage: *)
let () =
    let ret_val_1 = execute "let x = 5;;" in
    let ret_val_2 = execute "print_int (x * x);;" in  (* 25 appears in the browser console. *)
    print_endline ret_val_1;  (* Prints: "val x : int = 5" *)
    print_endline ret_val_2   (* Prints: "- : unit = ()" *)

25 появляется в консоли браузера после запуска кода из-за строки print_int (x * x). Я хочу использовать вывод (т. Е. 25) в DOM вместо того, чтобы отображать его в консоли браузера. Как я могу захватить стандартный вывод, произведенный функциями печати js_of_ocaml? т.е. как я могу получить 25 из кода выше?

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете подключить выход, используя Sys_js.set_channel_flusher stdout f, где f - это функция, которую вы должны определить, которая берет строку для печати и добавляет ее где-то в вашей DOM.

Если вы посмотрите на пример Toplevel, распространяемый с Js_of_ocaml, это то, что они делают. Форматтер подключен к фиктивной /dev/null, и они устанавливают «очиститель канала», который добавляет текст к «выходному» div, инкапсулированному div, класс которого stdout, очиститель канала stderr делает то же самое, но с классом stderr, позволяя печатать stderr красным цветом.

...