gpt4 book ai didi

ocaml - js_of_ocaml 中的 Marshal 和 magic_copy

转载 作者:行者123 更新时间:2023-12-04 11:56:01 25 4
gpt4 key购买 nike

新手问题。我正在经历非常好的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 使用)之间是否发生了变化,我在我的机器上安装的普通顶层中尝试了相同的示例,并得到了书中解释的结果:由于类型系统在检查编码(marshal)值时遇到麻烦而导致的段错误。
    (* Linux toplevel *)
# (ora_magic_copy 3: float) +. 2.1;;
Segmentation fault (core dumped)

我只是好奇:为什么?

我看到在三种情况下,Marshal.to_string 给出了相同的字符串:linux 编码一个 int、js_of_ocaml 编码和 int、js_of_ocaml 编码一个浮点数。奇数输出是 linux 顶层编码浮点数。

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

最佳答案

是的,您的问题来自您正在 javascript 顶层测试这一事实。

当您使用标准 ocaml顶层,+.操作对 OCaml 浮点数进行操作,即块内的双装箱,+. 的两个参数预计将成为指向此类框的指针。在您的示例中,您给出的不是指针,而是 OCaml 整数 2 (在内部,它表示为 5,即 2 << 1 + 1),因此 OCaml 在尝试读取内存中应该位于 0x5 位置的 double 值时出现段错误......

js_of_ocaml浏览器,浮点数只是javascript浮点数,整数是javascript整数,+.是 javascript 添加,它能够添加整数和浮点数(通过自动将整数转换为浮点数),因为值是由它们的类型标记的。

关于ocaml - js_of_ocaml 中的 Marshal 和 magic_copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com