2012-09-09 10 views
6

न्यूबी प्रश्न। मैं बहुत अच्छी Ocaml ORA पुस्तक के माध्यम से जा रहा हूँ। जब मैं मार्शल पर अनुभाग से magic_copy उदाहरण के साथ खेलने के लिए गया था, मैं एक टर्मिनल से एक ब्राउज़र के करीब था, इसलिए मैं ocsigen के toplevel in a browser, जहां मैं परिणाम प्राप्त करने में हैरान था यह पता करने की कोशिश की:मार्शल और magic_copy 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 

यह जांचना कि ओकंप 2 (वर्तमान संस्करण जब पुस्तक लिखी गई थी) और ओकंपल 3.12.1 के बीच कुछ बदल गया है, जो मेरी मशीन पर स्थापित किया गया है और js_of_ocaml द्वारा उपयोग किया गया है, मैंने अपनी मशीन पर स्थापित सामान्य अपरिवर्तित में एक ही उदाहरण की कोशिश की और मुझे मिला परिणाम पुस्तक में समझाया गया: मार्शल मूल्यों की जांच के साथ टाइप सिस्टम की परेशानी के कारण एक segfault।

(* Linux toplevel *) 
# (ora_magic_copy 3: float) +. 2.1;; 
Segmentation fault (core dumped) 

मैं सिर्फ उत्सुक हूं: क्यों?

मुझे लगता है कि तीन मामलों में, मार्शल.to_स्ट्रिंग एक ही स्ट्रिंग देता है: लिनक्स एक int, js_of_ocaml marshalling और int, js_of_ocaml एक फ्लोट marshalling marshalling। अजीब-आदमी-बाहर लिनक्स एक फ्लोट marshalling toplevel है।

क्या यह जावास्क्रिप्ट के मूल प्रकारों का उपयोग कर js_of_ocaml के बारे में कुछ है? या बस ... अपरिभाषित व्यवहार?

उत्तर

6

हां, आपकी समस्या इस तथ्य से आती है कि आप जावास्क्रिप्ट को अपरिवर्तनीय पर परीक्षण कर रहे हैं।

आप मानक ocaml उच्चस्तरीय उपयोग करते हैं, +. आपरेशन संचालित OCaml पर तैरता है, यानि कि एक डबल एक ब्लॉक के अंदर बॉक्सिंग, +. के दो मापदंडों इस तरह के बक्से की ओर इशारा होने की उम्मीद है। आपके उदाहरण में, एक सूचक के बजाय, आप ओकैमल पूर्णांक 2 (आंतरिक रूप से, इसे 5 के रूप में दर्शाया गया है, यानी 2 < < 1 + 1), इसलिए ओकैमल segfaults डबल पढ़ने की कोशिश करते समय स्मृति में 0x5 पर होना चाहिए ...

js_of_ocaml ब्राउज़र में, तैरता सिर्फ जावास्क्रिप्ट तैरता है, और पूर्णांकों जावास्क्रिप्ट पूर्णांक हैं, और +. जावास्क्रिप्ट इसके अलावा, जो पूर्णांकों जोड़ने में सक्षम है और (स्वचालित रूप से तैरता को पूर्णांकों में कनवर्ट करके) तैरता है, है क्योंकि मूल्यों उनके प्रकार से टैग किया जाता है।

संबंधित मुद्दे