2012-10-07 15 views
5

मैं ओकंपल में नया हूं और कुछ छोटे उदाहरण एप्लिकेशन लिखने की कोशिश कर रहा हूं। मैं लिनक्स उबंटू 10.04 के तहत ocamlc संस्करण 3.11.2 का उपयोग कर रहा हूं। मैं दो फ़ाइलों को संकलित करना चाहते हैं:एकाधिक ओकैम फाइलों को संकलित करना

a.ml 
b.ml 

फ़ाइल b.mla.ml से परिभाषाओं उपयोग करता है। जहां तक ​​मैं समझता हूं, मैं केवल संकलन करने के लिए ocamlc -c का उपयोग कर सकता हूं। मैं ocamlc को एक अंतिम बार कॉल कर सकता हूं जब मेरे पास सभी .cmo फ़ाइलें निष्पादन योग्य से लिंक करने के लिए होती हैं। साथ ही, किसी फ़ाइल को संकलित करते समय किसी अन्य फ़ाइल से परिभाषाओं का उपयोग करते समय, मुझे संकलक को बताना होगा जिसमें बाहरी परिभाषाओं को खोजने के लिए .cmi फ़ाइल है।

तो मेरा विचार का इस्तेमाल किया गया:

ocamlc -i -c a.ml > a.mli 
ocamlc -c a.mli b.ml 
ocamlc -o b a.cmo b.cmo 

पहला कदम काम करता है और फ़ाइलों a.mli और a.cmo पैदा करता है, लेकिन जब दूसरे चरण के लिए चल रहा

File "b.ml", line 1, characters 28-31: 
Error: Unbound value foo 

मिल जहां foo एक समारोह है कि a.ml में परिभाषित किया गया है और b.ml में बुलाया गया है।

तो मेरा सवाल है: मैं प्रत्येक स्रोत फ़ाइल को अलग से कैसे संकलित कर सकता हूं और कमांड लाइन पर आयात करने के लिए इंटरफेस निर्दिष्ट कर सकता हूं? मैं प्रलेखन में देख रहा हूं और जहां तक ​​मैं समझ सकता हूं मुझे .mli फ़ाइलों को शामिल करने के लिए निर्दिष्ट करना है, लेकिन मुझे नहीं पता कि कैसे।

संपादित

यहां कुछ और जानकारी। फ़ाइल a.ml परिभाषा

let foo = 5;; 

फ़ाइल b.ml अभिव्यक्ति

print_string (string_of_int foo)^"\n";; 

वास्तविक उदाहरण बड़ा है लेकिन इन फाइलों के साथ मैं पहले से ही त्रुटि मैं ऊपर की सूचना दी है शामिल हैं।

संपादित 2

मैं फ़ाइल b.ml संपादित और A.foo साथ foo प्रतिस्थापित करते हैं और इस काम करता है (foo b.ml में दिख रहा है, भले ही मैं एक संकलन त्रुटि जो इस प्रश्न के लिए महत्वपूर्ण नहीं है नहीं है)। मुझे लगता है कि फाइलों को स्पष्ट रूप से लिखने के लिए क्लीनर है, जैसा कि

+1

क्या आपने बी में ए खोल दिया था, क्योंकि अन्यथा यह समझ में नहीं आता है। –

+0

नहीं। क्या मुझे ए में एक मॉड्यूल परिभाषित करना है और इसे बी में खोलना है? फिलहाल ए में सभी परिभाषाएं वैश्विक हैं (मेरे पास कोई मॉड्यूल नहीं है)। – Giorgio

+1

प्रत्येक ओकैम फ़ाइल के लिए एक अंतर्निहित मॉड्यूल है। तो आपकी फ़ाइल 'a.ml'' ए' नामक मॉड्यूल को परिभाषित करती है। –

उत्तर

5

द्वारा स्पष्ट किया गया है यदि आप उस कोड को दिखाते हैं जो काम नहीं कर रहा है तो यह स्पष्ट होगा। जैसा कि क्रिस्टोफर बताते हैं, हालांकि, सबसे संभावित समस्या यह है कि आप निर्दिष्ट नहीं हैं कि कौन सा मॉड्यूल foo है। आप मॉड्यूल को A.foo के रूप में स्पष्ट रूप से निर्दिष्ट कर सकते हैं। या आप open A कर सकते हैं और बस foo नाम का उपयोग कर सकते हैं।

एक छोटे से उदाहरण के लिए इससे कोई फर्क नहीं पड़ता, लेकिन एक बड़ी परियोजना के लिए आपको सावधान रहना चाहिए कि open का उपयोग न करें। आप अपने मॉड्यूल में अच्छे नामों का उपयोग करने की आजादी चाहते हैं, और यदि आप उनमें से बहुत से खोलते हैं, तो अच्छे नाम एक दूसरे के साथ संघर्ष कर सकते हैं।

5

पहले जेफरी के उत्तर द्वारा समझाए गए अनुसार unbound value समस्या को ठीक करें। यह आपके द्वारा उपयोग किए जा रहे आदेशों के बारे में एक टिप्पणी है।

कई चरणों में संकलन को विघटित करना यह समझने का एक अच्छा तरीका है कि क्या हो रहा है। यदि आप अपना खुद का a.mli लिखना चाहते हैं, तो मॉड्यूल A मॉड्यूल के कुछ मान छिपाने की संभावना है, तो आपका आदेश ocaml -i -c a.ml > a.mli इस फ़ाइल का पहला संस्करण प्राप्त करने और फिर इसे संपादित करने का एक अच्छा तरीका है। लेकिन अगर आप a.mli छू नहीं कर रहे हैं, तो आप यह उत्पन्न करने के लिए की जरूरत नहीं है: क्या आप भी सीधे

ocamlc -o foo a.ml b.ml 

जो a.cmo, b.cmo और exectuable foo का उत्पादन करेगा डाल सकते हैं।

(यह भी a.cmi, a.mli की संकलित संस्करण है, कि तुम ocamlc -c a.mli जारी करके प्राप्त उत्पन्न होगा। इसी तरह यह भी b.cmi उत्पन्न होगा)।

ध्यान दें कि आदेश महत्वपूर्ण है: आपको कमांड लाइन पर b.ml से पहले a.ml प्रदान करने की आवश्यकता है। इस तरह, b.ml संकलित करते समय, कंपाइलर पहले से ही a.ml देख चुका है और जानता है कि मॉड्यूल A कहां से ढूंढें।


कुछ और टिप्पणियाँ:

  • आप सीधे अपने "जहाँ तक मैं समझता हूँ" पैराग्राफ में कर रहे हैं।
  • तुम सच में नहीं है शामिल एक अलग फाइल, यह अजगर में अधिक की तरह आयात है: मॉड्यूल A के मूल्यों उपलब्ध हैं, लेकिन नाम A.foo के तहत। a.ml की सामग्री को b.ml में प्रतिलिपि नहीं किया गया है, बल्कि a.ml में परिभाषित मॉड्यूल A के मानों को कॉपी किया गया है और यह संकलित संस्करण a.cmo एक्सेस किया गया है।
  • अगर आप b.ml में इस मॉड्यूल A उपयोग कर रहे हैं, तो आप b.ml से पहले कमांड लाइन पर निम्न में से किसी से पारित कर सकते हैं:
    • a.mli, जो a.cmi
    • a.cmi में संकलित किया जाएगा अगर आप पहले से ही है a.cmi
    • a.ml या उसके संकलित संस्करण a.cmo यदि आप अपने स्वयं a.mli लिखने के लिए, की जरूरत नहीं है में a.mli संकलित यानी अगर मॉड्यूल +०१२३०७५६०७ के डिफ़ॉल्ट इंटरफ़ेसआपको सूट देता है। (यह इंटरफ़ेस बस a.ml का हर मान है)।
संबंधित मुद्दे