新手問題。我正在閱讀非常好的Ocaml ORA書。當我從上元帥的部分magic_copy例如玩,我更接近比終端的瀏覽器,所以我想它在ocsigen的toplevel in a browser,在這裏我很驚訝地得到結果:js_of_ocaml中的元帥和magic_copy
(* 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編組一個int,js_of_ocaml編組和int,js_of_ocaml編組一個float。奇怪的是,在Linux頂層編組一個浮點數。
這是由於有關js_of_ocaml使用JavaScript的基類型?或者只是......未定義的行爲?