2012-09-09 22 views
6

新手問題。我正在閱讀非常好的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的基類型?或者只是......未定義的行爲?

回答

6

是的,你的問題來自於你正在測試一個javascript頂級的事實。

當使用標準ocaml頂層,所述+.操作進行操作上的OCaml漂浮,即雙塊內部盒裝,的+.兩個參數預計將指針這樣的盒子。在你的例子中,代替指針,你給OCaml整數2(內部表示爲5,即2 < 1 + 1),所以OCaml在嘗試讀取內存中位置爲0x5的double時發生段錯誤...

js_of_ocaml瀏覽器中,浮點數只是javascript浮點數,整數是javascript整數,而+.是javascript加法,它能夠添加整數和浮點數(通過自動將整數轉換爲浮點數),因爲值由他們的類型標記。