如何捕获 js_of_ocaml 顶层的标准输出

How to capture stdout of js_of_ocaml toplevel

我有这个 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) 行。我想在 DOM 中使用输出(即 25),而不是让它出现在浏览器控制台中。如何捕获 js_of_ocaml 的打印函数产生的标准输出?即如何从上面的代码中获取 25

您可以使用 Sys_js.set_channel_flusher stdout f 连接输出,其中 f 是您应该定义的函数,它获取要打印的字符串并将其附加到 DOM 中的某处。

如果您查看与 Js_of_ocaml 一起分发的 Toplevel 示例,它们就是这样做的。格式化程序被插入到一个虚拟 /dev/null 并且他们设置了一个 "channel flusher" 将文本附加到一个 "output" div 封装了一个 div 其 class是 stdout,stderr 通道刷新器做同样的事情,但使用 class stderr,使 stderr 以红色打印。