如何捕获ocaml顶级的js_标准输出

如何捕获ocaml顶级的js_标准输出,ocaml,js-of-ocaml,Ocaml,Js Of Ocaml,我有一个js_of_ocaml代码,它接受一个字符串并执行它(假设该字符串是ocaml代码): 运行代码后,25会出现在浏览器控制台中,因为有print_int(x*x)行。我想在DOM中使用输出(即25),而不是让它出现在浏览器控制台中。如何捕获由js_或ocaml的打印功能生成的标准输出?i、 e.如何从上述代码中获取25?您可以使用Sys\u js.set\u channel\u flusher stdout f连接输出,其中f是一个您应该定义的函数,用于打印字符串并将其附加到DOM中的某

我有一个js_of_ocaml代码,它接受一个字符串并执行它(假设该字符串是ocaml代码):


运行代码后,
25
会出现在浏览器控制台中,因为有
print_int(x*x)
行。我想在DOM中使用输出(即
25
),而不是让它出现在浏览器控制台中。如何捕获由js_或ocaml的打印功能生成的标准输出?i、 e.如何从上述代码中获取
25

您可以使用
Sys\u js.set\u channel\u flusher stdout f
连接输出,其中
f
是一个您应该定义的函数,用于打印字符串并将其附加到DOM中的某个位置

如果您看一下用Js_of_ocaml发布的顶级示例,他们就是这么做的。格式化程序被插入到一个虚拟的
/dev/null
,它们设置一个“通道冲洗器”,将文本附加到一个“输出”div,该div封装了一个类为
stdout
的div,stderr通道冲洗器执行相同的操作,但使用类
stderr
,使stderr能够以红色打印。

请参阅:
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 = ()" *)