1

我有这个 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从上面的代码中得到?

4

1 回答 1

1

Sys_js.set_channel_flusher stdout f您可以使用where是一个函数来连接输出f,您应该定义该函数将要打印的字符串并将其附加到 DOM 中的某个位置。

如果您查看与 Js_of_ocaml 一起分发的 Toplevel 示例,他们就是这样做的。Formatter 被插入一个虚拟对象/dev/null,他们设置了一个“通道冲洗器”,将文本附加到一个“输出”div,封装了一个类为 的 div stdout,stderr 通道冲洗器做同样的事情,但使用 class stderr,使 stderr 可以打印在红色的。

于 2018-11-07T15:49:03.977 回答