初心者の質問。私はとても素敵なOcamlORAの本を読んでいます。Marshalのセクションのmagic_copyの例を試してみたところ、ターミナルよりもブラウザーに近かったので、ブラウザーのocsigenのトップレベルで試してみましたが、結果が得られて驚きました。
(* 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
私のマシンにインストールされているトップレベルとjs_of_ocamlで使用されているocaml2(本が書かれたときの現在のバージョン)とocaml 3.12.1の間で何かが変わったかどうかを確認し、マシンにインストールされている通常のトップレベルで同じ例を試しました。本で説明されている結果:Marshaled値のチェックに関する型システムの問題によるセグメンテーション違反。
(* Linux toplevel *)
# (ora_magic_copy 3: float) +. 2.1;;
Segmentation fault (core dumped)
私はただ興味があります:なぜですか?
3つのケースで、Marshal.to_stringが同じ文字列を提供していることがわかります。つまり、Linuxはintをマーシャリングし、js_of_ocamlはマーシャリングし、int、js_of_ocamlはfloatをマーシャリングします。オッドマンアウトは、Linuxのトップレベルでフロートをマーシャリングすることです。
これは、javascriptの基本型を使用するjs_of_ocamlに関する何かが原因ですか?または単に...未定義の動作?