2010-05-28 6 views
11

मैं आईओ में अपना खुद का ऑपरेटर परिभाषित करने की कोशिश कर रहा हूं, और मुझे कठिन समय है। मैं एक वस्तु है:आईओ प्रोग्रामिंग भाषा में मैं अपने ऑपरेटरों को कैसे परिभाषित करूं?

MyObject := Object clone do(
    lst := list() 
    !! := method(n, lst at(n)) 
) 

लेकिन जब मैंने उसे फोन कर देते हैं:

x := MyObject clone do(lst appendSeq(list(1, 2, 3))) 
x !! 2 

लेकिन मैं एक अपवाद प्राप्त है कि तर्क 0 पर करने के लिए नहीं के बराबर नहीं होना चाहिए। मैं कैसे ठीक कर सकता हूं?

उत्तर

14

ठीक है, आपके कोड में एक समस्या है। सीधे शब्दों में कहें, आपने जोड़ा नहीं है !! ऑपरेटर टेबल के लिए। मैं आपको इस पर एक छोटी सी पृष्ठभूमि दूंगा।

एएसटी में निर्माण करने से पहले Io में ऑपरेटर shuffled हैं। इसका मतलब यह है कि हमें ज्ञात ऑपरेटरों की एक सूची को कुछ प्राथमिकता स्तरों के साथ बनाए रखना है ताकि यह पता चल सके कि कौन से लोग दूसरों की तुलना में कड़े बाध्य हैं। हम इसे "ऑपरेटरटेबल" में करते हैं। यदि आप आरईपीएल में हैं, तो आप आरईपीएल (उद्धरण के बिना) में "ऑपरेटरटेबल" टाइप करके इसका उपयोग कैसे कर सकते हैं। यह आपको ऑपरेटर की एक सूची देगा, (गतिशील रूप से जेनरेट किया गया है, इसलिए नए ऑपरेटरों को परिभाषित किया गया है), प्रत्येक प्रकार के ऑपरेटर का उपयोग करने के उदाहरणों के साथ। वहाँ दो प्रकार हैं:

  1. द्विआधारी ऑपरेटरों (1 + 2 उदाहरण के लिए, बस "संचालक" कहा जाता है)
  2. असाइनमेंट ऑपरेटरों (एक: उदाहरण के लिए = ख)
तो अपने उदाहरण में

, आपका कोड सही है; हमें वहां कुछ भी बदलने की ज़रूरत नहीं है। हालांकि, पार्सिंग उपप्रणाली को आपके ऑपरेटर को संभालने के तरीके के बारे में जानने के लिए हम एक बिट कोड खो रहे हैं। मैं एक उदाहरण प्रदान करूंगा जो मानता है कि आप इसे गुणा के रूप में तंग करना चाहते हैं।

OperatorTable addOperator("!!", 3) 

अब, हम देख सकते हैं कि इस संदेश के निर्माण और कैसे अपने पेड़ का प्रतिनिधित्व करती है को देखकर shuffled हो जाता है। फिर आरईपीएल में, अगर हम टाइप करें:

message(a !! b) 

हम कुछ इस तरह देखेंगे:

==> a !!(b) 

यह सिर्फ किसी अन्य विधि कॉल की तरह है, इसे कहीं अस्तित्व में है या फिर आप एक मिल जाएगा त्रुटि। आप इसका उपयोग कर सकते हैं जैसे यह ऊपर दिखाया गया है (स्पष्ट ब्रांडेसिस के साथ), या आप इसका उपयोग कर सकते हैं कि आप अपने मूल प्रश्न में स्पष्ट कंसोलिस के बिना कैसे चाहते हैं। किसी भी ऑपरेटर के साथ, यदि आप स्पष्ट ब्रांडेसिस का उपयोग नहीं करते हैं, तो आप प्राथमिकता के नियमों के अधीन हैं, इसलिए आप जानते हैं।

आशा है कि यह आपके प्रश्न का उत्तर देगा।

+1

आपके उत्तर के लिए धन्यवाद, जानने में मददगार। हालांकि, मुझे समझ में नहीं आता क्यों "एन" मेरे अंदर शून्य है !! तरीका। –

+3

ठीक है, अच्छी तरह से, आईओ में, केवल CFunctions (यानी, सी कोड में लागू विधियों जो विशिष्ट इंडेक्स पर विशिष्ट तर्क प्राप्त करते हैं) में आवश्यकता है कि आपको कम से कम एन तर्कों की आपूर्ति करनी चाहिए। जब कोई ऑपरेटर ज्ञात नहीं होता है, तो यह शफल नहीं होता है, जिसका अर्थ है आपका मूल एक्स !! 2 को इस रूप में देखा गया था: संदेश (x !! 2) और संदेश नहीं (x !! (2))। जबसे !! डिफ़ॉल्ट तर्क हैंडलिंग के साथ आईओ कोड में परिभाषित किया गया है, क्या होता है कि स्पष्ट रूप से प्रदान किए गए किसी भी तर्क को "शून्य" से भरा नहीं जाता है। यही है, तर्क परिभाषित हो जाते हैं, लेकिन वे शून्य पर इंगित करते हैं। यह आपकी समस्या का स्रोत है। – jer

+0

+1 पूरी तरह उत्तर देने के लिए, ऑपरेटरटेबल के बारे में ट्रिबिट के लिए प्राथमिकता क्रम का प्रतिनिधित्व करता है। मैंने यह नहीं देखा था। – labyrinth

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

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