ocaml的js中的封送和魔法副本

ocaml的js中的封送和魔法副本,ocaml,marshalling,js-of-ocaml,Ocaml,Marshalling,Js Of Ocaml,新手问题。我正在翻阅这本好书。当我去玩Marshal一节中的magic_copy示例时,我更接近于浏览器而不是终端,所以我在ocsigen's中进行了尝试,在那里我惊讶地得到了结果: (* 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 ->

新手问题。我正在翻阅这本好书。当我去玩Marshal一节中的magic_copy示例时,我更接近于浏览器而不是终端,所以我在ocsigen's中进行了尝试,在那里我惊讶地得到了结果:

     (* 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
我只是好奇:为什么

我看到在三种情况下,Marshal.to_字符串给出了相同的字符串:linux编组一个int,js_of_ocaml编组和int,js_of_ocaml编组一个float。奇怪的是linux顶层正在整理一个浮子


这是因为使用javascript的基本类型的js_of_ocaml吗?或者只是。。。未定义的行为?

是的,您的问题来自于您在javascript顶层进行测试的事实

当您使用标准的
ocaml
toplevel时,
+。
操作在ocaml浮动上操作,即块内的双框,
+。
的两个参数应为指向此类框的指针。在您的示例中,您给出的不是指针,而是OCaml整数
2
(在内部,它表示为5,即2)
    (* Linux toplevel *)
# (ora_magic_copy 3: float) +. 2.1;;
Segmentation fault (core dumped)