Newbie Frage. Ich gehe durch das sehr nette Ocaml ORA Buch. Als ich mit dem magic_copy Beispiel aus dem Abschnitt über Marshal zu spielen, war ich zu einem Browser näher als ein Terminal, so dass ich versuchte es in ocsigen der toplevel in a browser, wo ich war überrascht, das Ergebnis zu erhalten:Marshal und magic_copy in js_of_ocaml
(* 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
Überprüfen, ob sich etwas zwischen Okamel 2 (aktuelle Version, als das Buch geschrieben wurde) und Okaml 3.12.1, die von der auf meinem Rechner installierten Toplevel und von js_of_ocaml verwendet wurde, versuchte ich das gleiche Beispiel in der normalen Toplevel auf meinem Rechner und bekam das Ergebnis, das im Buch erklärt wird: ein segfault aufgrund der Probleme des Typsystems mit der Überprüfung von Marshalled-Werten.
(* Linux toplevel *)
# (ora_magic_copy 3: float) +. 2.1;;
Segmentation fault (core dumped)
Ich bin nur neugierig: warum?
Ich sehe, dass in drei Fällen Marshal.to_string die gleiche Zeichenfolge gibt: linux Marshalling ein Int, js_of_ocaml Marshalling und Int, js_of_ocaml Marsing ein Float. Der Odd-Man-Out ist ein Linux-Toplevel, der einen Float-Marshalling durchführt.
Ist das wegen etwas über js_of_ocaml mit Javascript Basistypen? Oder einfach ... undefiniertes Verhalten?