2012-02-05 14 views
5

मेरे फ़ोल्डर कई फ़ाइलें हैं, जो इस क्रम में संकलित किया गया है के लिए: global.ml, zone.ml, abs.ml, main.mlघोषणाएं और वैश्विक संदर्भ चर कई फ़ाइलों

global.ml सभी फ़ाइलों के लिए कुछ संदर्भ चर (जैसे let g1 = ref 0) शामिल हैं।

zone.ml में let f = !g1 एक घोषणा है।

abs.ml में, वहाँ है g1 := 5, जो चलाने के समय की शुरुआत में main द्वारा चलाया जाएगा, मैं इसे g1 के प्रारंभ असली रन-टाइम संदर्भ दिए गए पर विचार करें।

बाद में mainZone.f पर कॉल करेगा। उत्सुकता से, मुझे क्या लगता है कि f = 5 के बजाय f = 0 लेता है।

क्या आपको लगता है कि यह व्यवहार सामान्य है? यदि हां, तो मुझे !g1 के वर्तमान मूल्य को ध्यान में रखने के लिए, मुझे क्या बदलना चाहिए?

पीएस: शायद एक समाधान let f v = v को zone.ml में बनाना है तो mainZone.f !g1 पर कॉल करें। लेकिन मेरे पास g1global.ml में कई वैश्विक संदर्भ चर हैं, मुझे उम्मीद है कि वे सभी फाइलों और कार्यों पर मान्य हो सकते हैं, और मैं उन्हें किसी फ़ंक्शन के हस्ताक्षर में शामिल नहीं करना चाहता हूं।

उत्तर

6

आप मूल रूप से अपने मॉड्यूल में शीर्ष-स्तर मानों के मूल्यांकन के आदेश से संबंधित हैं। जिस क्रम में यह होता है वह उस क्रम से संबंधित नहीं है जो फ़ाइलों को संकलित करता है, लेकिन जब आप लिंक फ़ाइलों को प्रदर्शित करते हैं तो वे ऑर्डर करते हैं।

आप मॉड्यूल सीमाओं की अनदेखी करते हैं, तो यदि आप आदेश आप दे में फ़ाइलों को लिंक करते हैं, क्या आप इस तरह है:

let g1 = ref 0 
let f = !g1 
let() = g1 := 5 

यह आश्चर्य की बात f मूल्य होता है नहीं होना चाहिए 0.

ध्यान दें कि आपके main आवश्यक नहीं है कि रनटाइम पर होने वाली पहली चीज़ हो। जब आप उन्हें लिंक करते हैं तो फाइलों के क्रम में शीर्ष-स्तरीय मानों का मूल्यांकन किया जाता है। बहुत आम तौर पर, mainअंतिम होने वाली शीर्ष-स्तरीय चीज़ है (क्योंकि इसकी फ़ाइल आमतौर पर अंतिम होती है)।

(यह भी ध्यान रखें कि सिर्फ एक सम्मेलन, शायद मेरे जैसे पूर्व C प्रोग्रामर द्वारा अपनाई गई है सब पर एक main रही है। वहाँ main नाम के एक समारोह के लिए कोई आवश्यकता नहीं है। OCaml सिर्फ क्रम में शीर्ष स्तर के मूल्यों का मूल्यांकन करता है।)

संपादित करें:

यह है कि यह कैसे के बारे में अधिक जानकारी के बिना आपका कोड पुनर्गठन करने कहना मुश्किल है। आपकी समस्या का सार यह प्रतीत होता है कि आप f को zone.ml में शीर्ष-स्तर के अपरिवर्तनीय मान के रूप में परिभाषित करते हैं, लेकिन आप चाहते हैं कि इसका मान g1 का पालन करें, जो एक परिवर्तनीय मान है।

से f की परिभाषा को हटाने का सबसे आसान सुझाव !g1 के साथ फ़ाइल में हर जगह इसे प्रतिस्थापित करें।

यदि आप में शीर्ष स्तर पर f नाम रखना चाहते हैं, तो आपको इसे अपरिवर्तनीय मान के अलावा किसी अन्य चीज़ के रूप में फिर से परिभाषित करना होगा।

let f() = !g1 

तो फिर तुम f का उपयोग करता है zone.ml में f() द्वारा बजाय जगह लेंगे: एक समारोह सबसे स्पष्ट विकल्प है।

+0

आपकी टिप्पणी के लिए धन्यवाद, आपने समझाया कि ऐसा क्यों होता है, लेकिन आपने इसे हल करने की व्याख्या नहीं की है ... मैं इन फ़ाइलों के संकलन के क्रम को नहीं बदल सकता, मैं और क्या कर सकता हूं? – SoftTimur

+0

मैंने कुछ सुझावों के साथ ** संपादित ** जोड़ा। लेकिन यह जानना मुश्किल है कि आपके कोड के बारे में और जानने के बिना क्या सुझाव देना है। –

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