【发布时间】:2012-09-09 22:02:58
【问题描述】:
新手问题。我正在阅读非常好的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 使用,我在我的机器上安装的普通顶层中尝试了相同的示例机器并得到书中解释的结果:由于类型系统无法检查编组值而导致的段错误。
(* 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 的基本类型吗?或者只是......未定义的行为?
【问题讨论】:
标签: ocaml marshalling js-of-ocaml