2012-04-03 17 views
10

मैं ओकैमल मॉड्यूल के साथ बिल्कुल नया हूं और मैंने "इन" और "ओपन" दोनों को संयोजित किए बिना अपने मॉड्यूल का उपयोग करने में कामयाब नहीं रहा है। मैंने सफलता के बिना, एक अलग .mli फ़ाइल में हस्ताक्षर डालने का प्रयास किया है।ओकैमल मॉड्यूल: शामिल और खोलें?

नीचे मैं एक न्यूनतम (नहीं) उदाहरण काम कर, कि मैं

ocamlc -o main Robot.ml main.ml 

साथ संकलित करने के लिए क्या केवल "खुला" का उपयोग करने के लिए करने के लिए मैं क्या करने की जरूरत कोशिश कर रहा हूँ संकेत दिया हूँ, या केवल " शामिल हैं ", लेकिन उनमें से दोनों नहीं?


फ़ाइल "Robot.ml":

module type RobotSignature = 
sig 
    val top: unit -> unit 
end 

module Robot = 
struct 
    let top() = 
     begin 
     Printf.printf "top\n" 
     end 
    (* Should not be visible from the 'main' *) 
    let dummy() = 
     begin 
     Printf.printf "dummy\n" 
     end 
end 

फ़ाइल "main.ml" (काम नहीं कर रहा):

open Robot;; 

top(); 

फ़ाइल "main.ml" (काम):

include Robot;; 
open Robot;; 

top(); 
+0

मुझे लगता है कि आप अपने प्रश्नों के उत्तर की है। तुम भी के बारे में [संकलन इकाइयों] पढ़ने के लिए (http://caml.inria.fr/pub/docs/manual-ocaml/manual020.html) कर सकते हैं। लेकिन कृपया एक बार जब आप समझ जाएंगे कि 'खुला' क्या करता है। इसका उपयोग न करें, यह आपके कोड को समझने में काफी कठिन बनाता है। –

+0

वैसे मैं आम तौर पर सहमत हूं लेकिन उस मामले में उद्देश्य शुरुआती लोगों को मूल प्रोग्रामिंग (विशेष रूप से, लेकिन ओकैम तक ही सीमित नहीं) के लिए एक सरल "रोबोट लाइब्रेरी" प्रदान करना है। तो मैं जितना संभव हो Robot.top() वाक्यविन्यास से बचना पसंद करेंगे। –

+0

खैर मुझे लगता है कि यह वास्तव में यह बहुत ज्यादा understable शुरुआती वस्तु वे स्पष्ट पर कार्य कर रहे हैं प्रदान करने के लिए होगा। वैसे भी तुम भी की के प्रलेखन पर एक नज़र है करने के लिए चाहते हो सकता है [खुला] (http://caml.inria.fr/pub/docs/manual-ocaml/manual019.html#@manual.kwd170) और [शामिल] (http://caml.inria.fr/pub/docs/manual-ocaml/manual019.html#@manual.kwd171)। –

उत्तर

11

आपके पास रोबोट के दो स्तर हैं। चूंकि आपने रोबोट.एमएल फ़ाइल के भीतर अपने मॉड्यूल "रोबोट" को स्पष्ट रूप से बुलाया है, इसलिए आपको रोबोट खोलना होगा और फिर Robot.top() को कॉल करना होगा। Robot.ml फ़ाइल में कुछ भी रोबोट मॉड्यूल के अंदर पहले से ही डाल दिया गया है।

आप robot.ml में अतिरिक्त 'मॉड्यूल रोबोट' घोषणा से छुटकारा पा सकते हैं।

robot.ml बन जाएगा:

module type RobotSignature = 
sig 
    val top: unit -> unit 
end 


let top() = 
    begin 
     Printf.printf "top\n" 
    end 

तो यह आपके main.ml. में तुम्हारे पास है के रूप में काम करना चाहिए

अद्यतन नीचे टिप्पणी के आधार पर: आप चिंतित हैं कि robot.ml में अब सब कुछ दिखाई जाएगी हैं जब आप 'रोबोट खोलने' अगर आप एक robot.mli फ़ाइल जो कार्य करता है जो बाहर से उपलब्ध हैं निर्दिष्ट करता है परिभाषित कर सकते हैं। तो मान लें कि आपको जाने

val top: unit -> unit 

: उदाहरण के लिए, आप robot.ml में एक समारोह सहायक बुलाया जोड़ते हैं:

let top() = 
    begin 
    Printf.printf "top\n" 
    end 

let helper() = 
    Printf.printf "helper\n" 

... और इस प्रकार है तो आप अपने robot.mli को परिभाषित मुख्य से सहायक कॉल करने का प्रयास करें।मिलीलीटर:

open Robot;; 

top(); 
(* helper will not be visible here and you'll get a compile error*) 
helper() 

तो फिर तुम तो आपको एक त्रुटि मिल जाएगा संकलित करने के लिए प्रयास करते हुए:

$ ocamlc -o main robot.mli robot.ml main.ml 
File "main.ml", line 4, characters 0-6: 
Error: Unbound value helper 
+0

वास्तव में लेकिन अब हस्ताक्षर प्रभावी नहीं है क्योंकि सब कुछ मुख्य से दिखाई देता है। मैं "रोबोट के दो स्तर" को समझ गया, लेकिन मुझे कोई संकेत नहीं था कि उपयोगी हस्ताक्षर बनाए रखते हुए इसे कैसे ठीक किया जाए। –

+0

यदि आप यह सुनिश्चित करना चाहते हैं कि रोबोट मॉड्यूल के भीतर केवल मुख्य के भीतर दिखाई दे, तो robot.mli फ़ाइल को परिभाषित करें जो केवल निर्यात करता है जिसे आप निर्यात करना चाहते हैं (मैं इसे दिखाने के लिए ऊपर मेरी प्रतिक्रिया संपादित करूंगा)। – aneccodeal

5

आप दो तरह से यह करने के लिए है:

  • सबसे पहले, आप विवश कर सकते हैं अपने उप-संरचना सही हस्ताक्षर होने के लिए:

    module Robot : RobotSignature = struct ... end 
    

    फिर main.ml में, आप open Robot.Robot कर सकते हैं: पहला Robot मतलब है robot.ml से जुड़े संकलन इकाई, दूसरी Robot submodule आप अंदर robot.ml

  • परिभाषित किया है है तुम भी युक्त एक स्तर को हटाने और बना सकते हैं robot.mli:

    val top: unit -> unit 
    

    और robot.ml युक्त

    let top() = 
        Printf.printf "top\n" 
    
    (* Should not be visible from the 'main' *) 
    let dummy() = 
        Printf.printf "dummy\n" 
    

    आप main.ml में तो और का उपयोग कर बस open Robot का उपयोग मॉड्यूल संकलन कर सकते हैं।

+0

या बेहतर 'Robot' नहीं खोल लेकिन' Robot.top() 'कहते हैं। –

+0

और यदि '' 'Robot.Robot.top' '' लगातार उपयोग के लिए बहुत लंबा है, तो '' 'मॉड्यूल आर = रोबोट.Robot में R.top' '' लिखें ' – lambdapower

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