रूबी ब्लॉक/सी


6

में जावा बंद मैं पारित करने के लिए समझने के लिए कैसे रूबी ब्लॉक काम की कोशिश कर रहा है, और है कि मैं सी में उन्हें

एक आसान बंद लागू करने के लिए जिस तरह से लागू करने के लिए कोशिश कर रहा है क्या करना है एक void* बंद/कार्य करने के लिए संलग्न ढेर के लिए, लेकिन रूबी ब्लॉक भी ब्लॉक का उपयोग करने वाले दायरे से रिटर्न और ब्रेक स्टेटमेंट को संभालने लगते हैं।

loop do 
    break i if (i >= 4000) 
    i *= 2 
end 

मुझे लगता है कि जावा के लिए बंद प्रस्तावों में से एक भी इस तरह काम करता है।

तो, आप सी में रूबी-ब्लॉक/जावा-क्लोजर को कैसे कार्यान्वित करेंगे?

  0

"तो, आप सी में रुबी-ब्लॉक/जावा-क्लोजर कैसे कार्यान्वित करेंगे?" कम से कम जावा 7 जारी होने तक, जावा-क्लोजर जैसी कोई चीज़ नहीं है। 30 jan. 102010-01-30 00:23:52

  0

हाँ, यही कारण है कि मैंने पहले "जावा के लिए बंद प्रस्ताव" कहा था। 03 feb. 102010-02-03 02:06:49

10

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

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


2

वहाँ पाठ्यक्रम "जुनून के साथ रेल" के भाग के रूप रूबी ब्लाकों पर स्लाइड का एक अच्छा सेट है:

Ruby_Blocks.pdf

यह एक ब्लॉक का प्रतिनिधित्व करने के कवर, कि वे किस तरह तर्क पारित कर दिया और निष्पादित हो, और आगे भी प्रो ऑब्जेक्ट्स जैसी चीज़ों में। यह बहुत स्पष्ट रूप से समझाया गया है।

तब यह देखने के लिए रुचि हो सकती है कि जेआरबीई लोगों ने जावा को अपने पार्सिंग में कैसे संभाला। codehaus पर स्रोत पर नज़र डालें।


3

मैंने वास्तव में इनमें से कोई भी लागू नहीं किया है, इसलिए इसे नमक की बोरी से लें।

बंद करने के लिए दो भाग हैं: डेटा वातावरण और कोड वातावरण। जैसा कि आपने कहा था, आप डेटा के संदर्भों को संभालने के लिए शायद एक शून्य * पास कर सकते हैं। रूबी ब्रेक की आवश्यकता वाले गैर-रैखिक नियंत्रण प्रवाह कूद को लागू करने के लिए आप शायद setjmp और longjmp का उपयोग कर सकते हैं।

यदि आप बंद करना चाहते हैं तो आपको शायद ऐसी भाषा में प्रोग्रामिंग करना चाहिए जो वास्तव में उनका समर्थन करता है। :-)

अद्यतन: क्लैंग में दिलचस्प चीजें हो रही हैं। उन्होंने सी http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html के लिए एक बंद करने का प्रोटोटाइप किया है जो दिलचस्प पढ़ना साबित हो सकता है।