新手问题。我正在阅读非常好的Ocaml ORA书。当我去玩 Marshal 部分中的 magic_copy 示例时,我更接近于浏览器而不是终端,所以我在 ocsigen 的toplevel in a browser中尝试了它,我很惊讶地得到了结果:
(* js_of_ocaml *)
# let ora_magic_copy a =
let s = Marshal.to_string a [Marshal.Closures] in
Marshal.from_string s 0;;
val ora_magic_copy : 'a -> 'b = <fun>
# (ora_magic_copy 2 : float) +. 3.1;;
- : float = 5.1
检查 ocaml 2(本书编写时的当前版本)和 ocaml 3.12.1 之间是否发生了变化,由我的机器上安装的顶层和 js_of_ocaml 使用,我在我的机器上安装的普通顶层中尝试了相同的示例并得到了书中解释的结果:由于类型系统检查 Marshaled 值的麻烦而导致的段错误。
(* Linux toplevel *)
# (ora_magic_copy 3: float) +. 2.1;;
Segmentation fault (core dumped)
我只是好奇:为什么?
我看到在三种情况下,Marshal.to_string 给出了相同的字符串:linux marshalling an int,js_of_ocaml marshalling and int,js_of_ocaml marshalling a float。奇怪的人是 linux 顶级编组一个浮点数。
这是因为 js_of_ocaml 使用了 javascript 的基本类型吗?或者只是......未定义的行为?