2010-11-05 16 views
14

ठीक है, यह एक पैडेंटिक प्रश्न है लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं परिभाषा को सही ढंग से समझ रहा हूं। बंद उपनाम अनाम प्रक्रियाएं कि स्थानीय दायरे में लिफ्ट चर (वे वास्तव में या ऐसा नहीं हैं) या केवल जब वे लिफ्ट चर स्थानीय दायरे में क्या कर सकते हैं का वर्णन किया जाता है?क्लोजर यह क्या कर सकता है या क्योंकि यह

दूसरे शब्दों में एक गुमनाम समारोह क्षमता अपने स्थानीय क्षेत्र में चर लिफ्ट करने के लिए है, तो (क्योंकि भाषा की क्षमता प्रदान करता है कि), लेकिन नहीं, यह अभी भी एक बंद माना जाता है करता है?

मेरी समझ यह है कि यह केवल एक बंद है जब स्थानीय चर उठाए जाते हैं। लेकिन एक अज्ञात फ़ंक्शन जो नहीं करता है (भले ही यह कर सकता है) बंद नहीं है। तो सभी अज्ञात कार्य बंद नहीं हैं लेकिन सभी बंद अज्ञात कार्य हैं।

फिर, पैडेंट्री के लिए खेद है, लेकिन ये चीजें मुझ पर कुचली जाती हैं। :)

+0

जहां तक ​​आप पूछते हैं और सिखाते हैं, आप मेरे लिए pedantic नहीं हैं ^^ (http://dictionary.reference.com/browse/pedantic)। यह सवाल भी मुझे रूचि देता है! –

+1

इसे देखने का एक और तरीका यह है कि एक ऐसी भाषा में जो बंद हो गया है, अज्ञात फ़ंक्शंस जो स्थानीय चर नहीं उठाते हैं, वे समानता के लिए वास्तविक समय बंद होने के समान ही रन-टाइम पर प्रदर्शित होने की संभावना है। लेकिन अब जब आप इसका जिक्र करते हैं, हां, लोग कुछ परिवर्तनीय कैप्चर करते समय केवल "बंद" का उपयोग करते हैं। –

उत्तर

25

मान लिया जाये कि आप कंप्यूटर विज्ञान के संदर्भ में मतलब ...

एक बंद एक प्रथम श्रेणी के समारोह है जो अपने को परिभाषित वातावरण में मुक्त चर का शाब्दिक बाइंडिंग कब्जा है। एक बार जब यह लेक्सिकल बाइंडिंग पर कब्जा कर लेता है तो यह कार्य बंद हो जाता है क्योंकि यह उन चरों को "बंद कर देता है"।

नोट करें इसका मतलब है कि रन केवल रन टाइम पर मौजूद हैं।

फ़ंक्शन को बंद करने के लिए अज्ञात या नामित कार्य के लिए ऑर्थोगोनल है। आप एक ऐसी भाषा बना सकते हैं जो आपको नामित कार्यों को बंद करने के लिए परिभाषित करने की अनुमति दे।

यहाँ पायथन में एक "नाम" बंद है:

def maker(): 
    count=[0] 
    def counter(): 
    count[0]=count[0]+1 
    return count[0] 
    return counter 
+0

तो यदि यह स्थानीय चर को कैप्चर नहीं करता है तो यह किसी भी चर को "बंद नहीं" करता है और इसलिए यह बंद नहीं होता है; यह समझ आता है। केवल रनटाइम पर बंद होने पर अच्छा बिंदु। लेकिन मुझे लगता है कि अगर कोई रनटाइम पर बंद हो जाएगा तो कोड में बंद होने के नाते कोई इसके बारे में बात कर सकता है। औपचारिक रूप से सही नहीं हो सकता है लेकिन इस तरह से बात करना सुविधाजनक है। इस बारे में बिंदु लाने के लिए धन्यवाद कि एक बंद करने की अवधारणा एक एनन फ़ंक्शन की अवधारणा के लिए ऑर्थोगोनल है। मैंने इसके बारे में भी सोचा नहीं, लेकिन यह समझ में आता है। – hcoverlambda

+1

हालांकि (पाइथन और जावास्क्रिप्ट जैसी भाषाओं में) एक बंदर-रिंच में फेंकने के लिए, * युक्त स्कॉप्स * बाध्य हैं, केवल मुक्त चर नहीं। उदाहरण के लिए, 'eval' या 'स्थानीय()' के उपयोग पर विचार करें - एक शाखा के अंदर, कम नहीं! अब क्या? :-) –

+1

पायथन गुंजाइश नहीं बांधता है। जब आप 'काउंटर' परिभाषा का मूल्यांकन करते हैं, तो यह प्रत्येक कैप्चर वैरिएबल के लिए "क्लोजर सेल" बनाता है, और उन्हें 'काउंटर' फ़ंक्शन में संग्रहीत करता है। 'निर्माता() .__ बंद करने __ [0] .cell_contents' उस सूची का संदर्भ है जो' काउंटर' परिभाषित समय पर 'गिनती' के लिए बाध्य था। (यह थोड़ा उलझन में भी है कि पाइथन कभी-कभी उन कार्यों के बजाए कोशिकाओं के ट्यूपल को संदर्भित करने के लिए "बंद" का उपयोग करता है, लेकिन इसे अनदेखा करता है।) इस बीच, 'निर्माता() .__ कोड __। Co_freevars [0] '' 'c''। इस तरह यह जानता है कि 'c' का संदर्भ सेल 0 पर' LOAD_DEREF' है। – abarnert

0

को बंद करने से एक महान परिभाषा यहाँ परिभाषित किया गया है: lua.org

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

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