如何捕获 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 以红色打印。
我有这个 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 以红色打印。