如何捕获ocaml顶级的js_标准输出
我有一个js_of_ocaml代码,它接受一个字符串并执行它(假设该字符串是ocaml代码):如何捕获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中的某
运行代码后,
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 = ()" *)