2012-05-23 8 views
5

मुझे लगता है कि मेरे पास यह है, लेकिन मैं पुष्टि करना चाहता हूं।स्कोप आम तौर पर नेस्टेड फ़ंक्शंस के उपयोग को कैसे प्रभावित करता है?

  1. गतिशील गुंजाइश के साथ

    , यह कोई बात नहीं एक एक नेस्टेड समारोह या एक अलग समारोह का उपयोग करता है, के रूप में चर बस कॉल स्टैक पर निर्भर हैं।

  2. केवल शुद्ध कार्यों के साथ, इससे कोई फर्क नहीं पड़ता कि कोई नेस्टेड फ़ंक्शन या एक अलग फ़ंक्शन का उपयोग करता है या नहीं। यह दायरे के प्रकार के बावजूद सच है।

  3. लेक्सिकल स्कोप के साथ, नेस्टेड फ़ंक्शंस मोटे तौर पर डायनामिक स्कोप के साथ फ़ंक्शन को कॉल करने की नकल करते हैं।

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

नोट: शुद्ध कार्य से, मेरा मतलब पूरी तरह से शुद्ध कार्य है: केवल एक ही चीज "पढ़ा" पैरामीटर है, केवल एक ही चीज "लिखित" कार्य वापसी है।

धन्यवाद

+0

स्टैंडर्ड सी नेस्ट फ़ंक्शन नहीं है, इसलिए मैं अपने शीर्षक और टैग संपादित कर लिया है! –

+0

धन्यवाद, हालांकि केवल 4 बजे के लिए मैं वास्तव में भाषाओं-विशिष्टताओं से चिंतित हूं। 1-3 के लिए मैं सामान्य रूप से शब्दावली के बारे में सोच रहा हूं, यानी अंगूठे के नियम जो किसी भी भाषा के लिए आवेदन करना चाहिए जो उचित रूप से व्याख्यात्मक स्कोपिंग लागू करता है। तो अपवाद होने पर यह ठीक है। – Sonarpulse

+0

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

उत्तर

1

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

  1. यह सही है, लेकिन कुछ भाषाओं दोनों गतिशील और शाब्दिक गुंजाइश समर्थन, प्रोग्रामर जो उपयोग करने के लिए (उदाहरण के लिए Clojure और कॉमन लिस्प,) निर्दिष्ट करने की अनुमति देकर इस जटिल।

  2. यह भी सही है। इस मामले में आप किस बारे में बात कर रहे हैं वह कोई फंक्शन नहीं है जिसके बिना कोई दुष्प्रभाव है और मुफ्त चर के बिना।

  3. यह बिल्कुल सही नहीं है, यह उससे अधिक जटिल है। प्रथम श्रेणी के कार्यों और बंदियों का समर्थन करने वाले लेक्सिकल स्कोप वाली भाषा में, एक नेस्टेड फ़ंक्शन से अधिक मुक्त चर जो पर्यावरण में बंधे हैं, में बंद हैं, और आप उस कार्य को बाहरी दायरे में वापस कर सकते हैं, और उन बंद- चर से अधिक सुलभ हो जाएगा और उन मूल दायरे को संदर्भित किया जाएगा जिन्हें वे परिभाषित किए गए थे। फिर, विशिष्ट प्रोग्रामिंग भाषाओं से ठोस उदाहरणों के बिना अमूर्त में बात करना मुश्किल है, इसलिए यदि आपके मन में कुछ है, तो आपको कोड के साथ अपना प्रश्न संपादित करना चाहिए नमूने हैं।

  4. मुझे यकीन नहीं है कि "कचरा सफाई" से आपका क्या मतलब है? यदि आप स्वचालित मेमोरी प्रबंधन के रूप में कचरा संग्रह का जिक्र कर रहे हैं, तो यह सामान्य रूप से सही नहीं है, लेकिन मैं नेस्टेड फ़ंक्शंस के साथ जीएनयू सी के विशिष्ट मामले पर टिप्पणी नहीं करूंगा, क्योंकि मुझे नहीं पता कि यह वास्तव में कैसे काम करता है।

+0

मुझे लगता है कि वह जीसीसी नेस्टेड फ़ंक्शन एक्सटेंशन – slezica

+0

हाँ के बारे में बात कर रहा है, हाँ, मुझे संपादन के बाद पता चला, लेकिन उसने गतिशील क्षेत्र के बारे में भी पूछा जो सी में मौजूद नहीं है, है ना? – spacemanaki

+0

यहां खुशी है कि मैं पहले दो पर सही हूं। – Sonarpulse

2

आपके पास यह सही है। मैं इसे अपने मस्तिष्क में केस-दर-मामले mnemo के रूप में रखने की कोशिश नहीं करता, हालांकि - whys को समझने की कोशिश करें, और आप कम आश्चर्य में भाग लेंगे।

विषय पर प्रलेखन (http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html पर) बहुत अच्छा है।यदि आप जानते हैं कि स्टैक सी में कैसे काम करता है, तो आपको तुरंत समझना चाहिए।

इसके अलावा, एक उपहार मैं interwebs कि उपयोगी हो सकता है पर पाया, आपके सवाल दिए गए:

#define lambda(type, body) ({ \ 
    type __anon_func__ body \ 
    __anon_func__; \ 
}) 

int (*foo) (double) = lambda(int, (double x) { return (int) x; }); 
+0

आपके पास दिलचस्प मैक्रो है। अंतर्निहित विशेषता कहां है, __anon_func__, से आती है? मैं इसे किसी कारण से नहीं ढूंढ सकता। – Sonarpulse

+0

'Anon func' वह नाम है जिसे मैंने दिया था। वहां इस्तेमाल की गई दो जीसीसी सुविधाओं में यौगिक बयान और घोंसले वाले कार्य होते हैं। – slezica

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