क्लोजर (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 3: Line 3:
{{distinguish|text=प्रोग्रामिंग भाषा [[क्लोजर]]}}
{{distinguish|text=प्रोग्रामिंग भाषा [[क्लोजर]]}}


[[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में, '''क्लोजर''', '''शाब्दिक क्लोजर''' या '''फंक्शन क्लोजर''' भी प्रथम श्रेणी के फंक्शन के साथ भाषा में [[लेक्सिकली स्कोप्ड|शाब्दिकी विस्तार]] [[नाम बंधन]] को प्रयुक्त करने की विधि है। क्रियात्मक रूप से [[परिचालन शब्दार्थ]], क्लोजर [[रिकॉर्ड (कंप्यूटर विज्ञान)]] है। जो [[समारोह (कंप्यूटर विज्ञान)|फंक्शन (कंप्यूटर विज्ञान)]] को पर्यावरण के साथ संग्रहित करता है।<ref>Sussman and Steele. "Scheme: An interpreter for extended lambda calculus". "... a data structure containing a lambda expression, and an environment to be used when that lambda expression is applied to arguments." ([[s:Page:Scheme - An interpreter for extended lambda calculus.djvu/22|Wikisource]])</ref> चूँकि पर्यावरण मानचित्रण है। जो फंक्शन के प्रत्येक [[मुक्त चर]] को जोड़ता है। (चर जो स्थानीय रूप से उपयोग किए जाते हैं। किन्तु संलग्न चक्र में परिभाषित होते हैं।) अतः [[मूल्य (कंप्यूटर विज्ञान)]] या [[संदर्भ (कंप्यूटर विज्ञान)]] के साथ जिसका नाम बंधन होने पर नाम बाध्य बनाया गया था।{{efn|These names most frequently refer to values, mutable variables, or functions, but can also be other entities such as constants, types, classes, or labels.}} सामान्यतः साधारण फंक्शन के विपरीत, क्लोजर फंक्शन को अधिकृत किए गए चरों को उनके मूल्यों या संदर्भों की क्लोजर प्रतियों के माध्यम से प्रवेश करने की अनुमति देता है, तथापि जब फंक्शन को उनके चक्र से बाहर वर्णित किया जाता है।
[[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में, '''क्लोजर''', '''शाब्दिक क्लोजर''' या '''फंक्शन क्लोजर''' भी प्रथम श्रेणी के फंक्शन के साथ भाषा में [[लेक्सिकली स्कोप्ड|शाब्दिकी विस्तार]] [[नाम बंधन]] को प्रयुक्त करने की विधि है। क्रियात्मक रूप से [[परिचालन शब्दार्थ]], क्लोजर [[रिकॉर्ड (कंप्यूटर विज्ञान)]] होता है। जो [[समारोह (कंप्यूटर विज्ञान)|फंक्शन (कंप्यूटर विज्ञान)]] को पर्यावरण के साथ संग्रहित करता है।<ref>Sussman and Steele. "Scheme: An interpreter for extended lambda calculus". "... a data structure containing a lambda expression, and an environment to be used when that lambda expression is applied to arguments." ([[s:Page:Scheme - An interpreter for extended lambda calculus.djvu/22|Wikisource]])</ref> चूँकि पर्यावरण मानचित्रण है। जो फंक्शन के प्रत्येक [[मुक्त चर]] को जोड़ता है। (चर जो स्थानीय रूप से उपयोग किए जाते हैं। किन्तु संलग्न क्षेत्र में परिभाषित होते हैं।) अतः [[मूल्य (कंप्यूटर विज्ञान)]] या [[संदर्भ (कंप्यूटर विज्ञान)]] के साथ जिसका नाम बंधन होने पर नाम बाध्य बनाया गया था।{{efn|These names most frequently refer to values, mutable variables, or functions, but can also be other entities such as constants, types, classes, or labels.}} सामान्यतः साधारण फंक्शन के विपरीत, क्लोजर फंक्शन को अधिकृत किए गए चरों को उनके मूल्यों या संदर्भों की क्लोजर प्रतियों के माध्यम से प्रवेश करने की अनुमति देता है। तथापि जब फंक्शन को उनके क्षेत्र से बाहर वर्णित किया जाता है।
[[Category: Templates Vigyan Ready]]
[[Category: Templates Vigyan Ready]]
== इतिहास और व्युत्पत्त ==
== इतिहास और व्युत्पत्त ==
क्लोजर की अवधारणा को सन्न 1960 के दशक में λ-कैलकुलस में भावों के यांत्रिक मूल्यांकन के लिए विकसित किया गया था और प्रथम बार सन्न 1970 में पूर्ण प्रकार से आरपीएल प्रोग्रामिंग भाषा में भाषा सुविधा के रूप में प्रयुक्त किया गया था। जिससे कि शाब्दिक रूप से प्रथम श्रेणी के फंक्शन का समर्थन किया जा सकता है।<ref name=dat2012>[[David A. Turner]] (2012). [http://www.cs.kent.ac.uk/people/staff/dat/tfp12/tfp12.pdf "Some History of Functional Programming Languages"]. Trends in Functional Programming '12. Section 2, note 8 contains the claim about M-expressions.</ref>
क्लोजर की अवधारणा को सन्न 1960 के दशक में λ-कैलकुलस में भावों के यांत्रिक मूल्यांकन के लिए विकसित किया गया था और प्रथम बार सन्न 1970 में पूर्ण प्रकार से आरपीएल प्रोग्रामिंग भाषा में भाषा सुविधा के रूप में प्रयुक्त किया गया था। जिससे कि शाब्दिक रूप से प्रथम श्रेणी के फंक्शन का समर्थन किया जा सकता था।<ref name=dat2012>[[David A. Turner]] (2012). [http://www.cs.kent.ac.uk/people/staff/dat/tfp12/tfp12.pdf "Some History of Functional Programming Languages"]. Trends in Functional Programming '12. Section 2, note 8 contains the claim about M-expressions.</ref>


पीटर जे. लैंडिन ने सन्न 1964 में टर्म क्लोजर को पर्यावरण भाग और नियंत्रण भाग के रूप में परिभाषित किया था। जैसा कि अभिव्यक्ति के मूल्यांकन के लिए उनकी एसईसीडी मशीन द्वारा उपयोग किया जाता है।<ref name="landin">{{citation
पीटर जे. लैंडिन ने सन्न 1964 में सीमा क्लोजर को पर्यावरण भाग और नियंत्रण भाग के रूप में परिभाषित किया था। जैसा कि अभिव्यक्ति के मूल्यांकन के लिए उनकी एसईसीडी मशीन द्वारा उपयोग किया जाता है।<ref name="landin">{{citation
| author = P. J. Landin | year = 1964 | title = The mechanical evaluation of expressions | author-link = Peter J. Landin }}</ref> [[जोएल मूसा|जोएल मोसेस]] ने लैम्ब्डा अभिव्यक्ति को संदर्भित करने के लिए क्लोजर शब्द की शुरुआत करने का श्रेय लैंडिन को दिया है। जिसके खुला बंधन (नि: शुल्क चरों) को शाब्दिक वातावरण द्वारा (या आंतरिक) क्लोजर कर दिया गया है। जिसके परिणामस्वरूप क्लोजर अभिव्यक्ति या क्लोजर होता है।<ref>{{citation
| author = P. J. Landin | year = 1964 | title = The mechanical evaluation of expressions | author-link = Peter J. Landin }}</ref> [[जोएल मूसा|जोएल मोसेस]] ने लैम्ब्डा अभिव्यक्ति को संदर्भित करने के लिए क्लोजर शब्द की शुरुआत करने का श्रेय लैंडिन को दिया है। जिसके खुला बंधन (नि: शुल्क चरों) को शाब्दिक वातावरण द्वारा (या आंतरिक) क्लोजर कर दिया गया है। जिसके परिणामस्वरूप क्लोजर अभिव्यक्ति या क्लोजर होता है।<ref>{{citation
| author = Joel Moses |date=June 1970 | title = The Function of FUNCTION in LISP, or Why the FUNARG Problem Should Be Called the Environment Problem | id = [[AI Memo]] 199| quote = A useful metaphor for the difference between FUNCTION and QUOTE in LISP is to think of QUOTE as a porous or an open covering of the function since free variables escape to the current environment. FUNCTION acts as a closed or nonporous covering (hence the term "closure" used by Landin). Thus we talk of "open" Lambda expressions (functions in LISP are usually Lambda expressions) and "closed" Lambda expressions. [...] My interest in the environment problem began while Landin, who had a deep understanding of the problem, visited MIT during 1966–67. I then realized the correspondence between the FUNARG lists which are the results of the evaluation of "closed" Lambda expressions in [[LISP 1.5|LISP]] and [[ISWIM]]'s Lambda Closures.|hdl=1721.1/5854 |author-link=Joel Moses }}</ref><ref>{{cite book| author = Åke Wikström| year = 1987| title = Functional Programming using Standard ML| isbn = 0-13-331968-7| quote = The reason it is called a "closure" is that an expression containing free variables is called an "open" expression, and by associating to it the bindings of its free variables, you close it.| author-link = Åke Wikström}}</ref> इस प्रयोग को पश्चात् में [[गेराल्ड जे सुस्मान]] और गाइ एल. स्टील, जूनियर द्वारा अपनाया गया था। जब उन्होंने सन्न 1975 में योजना (प्रोग्रामिंग भाषा) को परिभाषित किया था।<ref>{{citation| author = [[Gerald Jay Sussman]] and [[Guy L. Steele, Jr.]]|date=December 1975| title = Scheme: An Interpreter for the Extended Lambda Calculus| id = [[AI Memo]] 349}}</ref> अतः [[लिस्प (प्रोग्रामिंग भाषा)]] का शाब्दिकी विस्तार रूपांतर और व्यापक हो गया है।
| author = Joel Moses |date=June 1970 | title = The Function of FUNCTION in LISP, or Why the FUNARG Problem Should Be Called the Environment Problem | id = [[AI Memo]] 199| quote = A useful metaphor for the difference between FUNCTION and QUOTE in LISP is to think of QUOTE as a porous or an open covering of the function since free variables escape to the current environment. FUNCTION acts as a closed or nonporous covering (hence the term "closure" used by Landin). Thus we talk of "open" Lambda expressions (functions in LISP are usually Lambda expressions) and "closed" Lambda expressions. [...] My interest in the environment problem began while Landin, who had a deep understanding of the problem, visited MIT during 1966–67. I then realized the correspondence between the FUNARG lists which are the results of the evaluation of "closed" Lambda expressions in [[LISP 1.5|LISP]] and [[ISWIM]]'s Lambda Closures.|hdl=1721.1/5854 |author-link=Joel Moses }}</ref><ref>{{cite book| author = Åke Wikström| year = 1987| title = Functional Programming using Standard ML| isbn = 0-13-331968-7| quote = The reason it is called a "closure" is that an expression containing free variables is called an "open" expression, and by associating to it the bindings of its free variables, you close it.| author-link = Åke Wikström}}</ref> इस प्रयोग को पश्चात् में [[गेराल्ड जे सुस्मान]] और गाइ एल. स्टील, जूनियर द्वारा अपनाया गया था। जब उन्होंने सन्न 1975 में योजना (प्रोग्रामिंग भाषा) को परिभाषित किया था।<ref>{{citation| author = [[Gerald Jay Sussman]] and [[Guy L. Steele, Jr.]]|date=December 1975| title = Scheme: An Interpreter for the Extended Lambda Calculus| id = [[AI Memo]] 349}}</ref> अतः [[लिस्प (प्रोग्रामिंग भाषा)]] का शाब्दिकी विस्तार रूपांतर और व्यापक हो गया है।


सुस्मान और [[हेरोल्ड एबेलसन]] भी सन्न 1980 के दशक में दूसरे, असंबंधित अर्थ के साथ क्लोजर शब्द का उपयोग करते हैं। चूँकि ऑपरेटर की संपत्ति जो [[डेटा संरचना]] में डेटा जोड़ती है और स्थिर डेटा संरचनाओं को भी जोड़ने में सक्षम होती है। अतः यह शब्द का प्रयोग कंप्यूटर विज्ञान में पूर्व उपयोग के अतिरिक्त क्लोजर (गणित) से आता है। जिसे लेखक शब्दावली में इस ओवरलैप को "दुर्भाग्यपूर्ण" मानते हैं।<ref>{{cite book |last1=Abelson |first1=Harold |last2=Sussman |first2=Gerald Jay |last3=Sussman |first3=Julie |date=1996 |title=Structure and Interpretation of Computer Programs |url=https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html |location=Cambridge, MA |publisher=MIT Press |page=98–99 |isbn=0262510871}}</ref>
सुस्मान और [[हेरोल्ड एबेलसन]] भी सन्न 1980 के दशक में दूसरे असंबंधित अर्थ के साथ क्लोजर शब्द का उपयोग करते हैं। चूँकि ऑपरेटर की संपत्ति जो [[डेटा संरचना]] में डेटा जोड़ती है और स्थिर डेटा संरचनाओं को भी जोड़ने में सक्षम होती है। अतः यह शब्द का प्रयोग कंप्यूटर विज्ञान में पूर्व उपयोग के अतिरिक्त क्लोजर (गणित) से आता है। जिसे लेखक शब्दावली में इस ओवरलैप को "दुर्भाग्यपूर्ण" मानते हैं।<ref>{{cite book |last1=Abelson |first1=Harold |last2=Sussman |first2=Gerald Jay |last3=Sussman |first3=Julie |date=1996 |title=Structure and Interpretation of Computer Programs |url=https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html |location=Cambridge, MA |publisher=MIT Press |page=98–99 |isbn=0262510871}}</ref>
== अनाम कार्य ==
== अनाम कार्य ==
{{further|अनाम समारोह}}
{{further|अनाम समारोह}}


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


उदाहरण के लिए, निम्नलिखित [[पायथन (प्रोग्रामिंग भाषा)]] कोड में,
उदाहरण के लिए, निम्नलिखित [[पायथन (प्रोग्रामिंग भाषा)]] कोड में,
Line 38: Line 38:
जोर बी (5) == 6
जोर बी (5) == 6


# प्रथम चर से आबद्ध किए बिना क्लोजर का उपयोग करना।
# प्रथम चर से आबद्ध किए बिना क्लोजर का उपयोग करता है।
सामान्यतः <code>a</code> और <code>b</code> के मान क्लोजर होते है। जो दोनों स्थितियों में स्थिर फंक्शन को संलग्न फंक्शन से मुक्त चर के साथ लौटाकर उत्पादित किया जाता है। जिससे कि मुक्त चर संलग्न फंक्शन के पैरामीटर <code>x</code> के मान से जुड़ जाता है। चूँकि <code>a</code> और <code>b</code> में क्लोजर कार्यात्मक रूप से समान हैं। कार्यान्वयन में एकमात्र अंतर यह है कि प्रथम स्थितियों में हमने नाम, <code>g</code> के साथ स्थिर फंक्शन का उपयोग नाम के साथ किया था। (अज्ञात फंक्शन बनाने के लिए पाइथन संकेत शब्द <code>लैम्ब्डा</code>का उपयोग करके) उन्हें परिभाषित करने में यदि कोई मूल नाम प्रयुक्त हो, वह अप्रासंगिक है।
सामान्यतः <code>a</code> और <code>b</code> के मान क्लोजर होते है। जो दोनों स्थितियों में स्थिर फंक्शन को संलग्न फंक्शन से मुक्त चर के साथ वापस करके उत्पादित किया जाता है। जिससे कि मुक्त चर संलग्न फंक्शन के पैरामीटर <code>x</code> के मान से जुड़ जाता है। चूँकि <code>a</code> और <code>b</code> में क्लोजर कार्यात्मक रूप से समान हैं। कार्यान्वयन में एकमात्र अंतर यह है कि प्रथम स्थितियों में हमने नाम <code>g</code> के साथ स्थिर फंक्शन का उपयोग नाम के साथ किया था। (अज्ञात फंक्शन बनाने के लिए पाइथन संकेत शब्द <code>लैम्ब्डा</code>का उपयोग करके) उन्हें परिभाषित करने में यदि कोई मूल नाम प्रयुक्त होता है, वह अप्रासंगिक है।


क्लोजर किसी भी अन्य मान की भांति मान है। इसके चर को नियुक्त करने की आवश्यकता नहीं है और इसके अतिरिक्त इसे सीधे उपयोग किया जा सकता है। जैसा कि उदाहरण की अंतिम दो पंक्तियों में दिखाया गया है। इस उपयोग को अनाम क्लोजर माना जा सकता है।
क्लोजर किसी भी अन्य मान की भांति वह मान है। इसके चर को नियुक्त करने की आवश्यकता नहीं है और इसके अतिरिक्त इसे सीधे उपयोग किया जा सकता है। जैसा कि उदाहरण की अंतिम दो पंक्तियों में दिखाया गया है। इस उपयोग को अनाम क्लोजर माना जा सकता है।


चूँकि स्थिर फंक्शन परिभाषाएं स्वयं क्लोजर नहीं हैं। उनके समीप मुक्त चर है। जो अभी तक बाध्य नहीं है। अतः केवल संलग्न फंक्शन का मूल्यांकन पैरामीटर के मान के साथ किया जाता है। स्थिर फंक्शन सीमित का मुक्त चर होता है। जो क्लोजर बनाता है। जिसे पश्चात् में संलग्न फंक्शन से लौटाया जाता है।
चूँकि स्थिर फंक्शन परिभाषाएं स्वयं क्लोजर नहीं हैं। उनके समीप मुक्त चर है। जो अभी तक बाध्य नहीं है। अतः केवल संलग्न फंक्शन का मूल्यांकन पैरामीटर के मान के साथ किया जाता है। स्थिर फंक्शन सीमित का मुक्त चर होता है। जो क्लोजर बनाता है। जिसे पश्चात् में संलग्न फंक्शन से लौटाया जाता है।


अंत में, गैर-स्थानीय चर के चक्र से बाहर होने पर क्लोजर केवल मुक्त चर वाले फंक्शन से प्रथक होता है। अन्यथा परिभाषित वातावरण और निष्पादन वातावरण से मेल खाते हैं और इन्हें प्रथक करने के लिए कुछ भी नहीं है। (स्थैतिक और गतिशील बाध्यकारी को प्रथक नहीं किया जा सकता है। जिससे कि नाम समान मानों को हल करते हैं।) उदाहरण के लिए, नीचे दिए गए प्रोग्राम में, मुक्त चर <code>x</code> (वैश्विक सीमा के साथ गैर-स्थानीय चर <code>x</code> के लिए बाध्य) वाले कार्यो को उसी वातावरण में निष्पादित किया जाता हैं। जहाँ <code>x</code> को परिभाषित किया गया है। अतः यह सारहीन है कि क्या ये वास्तव में क्लोजर हैं।
अंत में, गैर-स्थानीय चर के क्षेत्र से बाहर होने पर क्लोजर केवल मुक्त चर वाले फंक्शन से प्रथक होता है। अन्यथा परिभाषित वातावरण और निष्पादन वातावरण से मेल खाते हैं और इन्हें प्रथक करने के लिए कुछ भी नहीं है। (स्थैतिक और गतिशील बाध्यकारी को प्रथक नहीं किया जा सकता है। जिससे कि नाम समान मानों को हल करते हैं।) उदाहरण के लिए, नीचे दिए गए प्रोग्राम में, मुक्त चर <code>x</code> (वैश्विक सीमा के साथ गैर-स्थानीय चर <code>x</code> के लिए बाध्य) वाले कार्यो को उसी वातावरण में निष्पादित किया जाता हैं। जहाँ <code>x</code> को परिभाषित किया गया है। अतः यह सारहीन है कि क्या ये वास्तव में क्लोजर हैं।


एक्स = 1
एक्स = 1
Line 58: Line 58:
नक्शा (लैम्ब्डा वाई, एक्स + वाई, अंक)
नक्शा (लैम्ब्डा वाई, एक्स + वाई, अंक)


यह अधिकांशतः फंक्शन वापसी द्वारा प्राप्त किया जाता है। चूँकि फंक्शन को गैर-स्थानीय चर के चक्र में परिभाषित किया जाना चाहिए। इस स्थितियों में सामान्यतः इसका चक्र <code>g</code> छोटा होता है।
यह अधिकांशतः फंक्शन वापसी द्वारा प्राप्त किया जाता है। चूँकि फंक्शन को गैर-स्थानीय चर के क्षेत्र में परिभाषित किया जाना चाहिए। इस स्थितियों में सामान्यतः इसका क्षेत्र <code>g</code> छोटा होता है।


यह [[चर छायांकन]] (जो गैर-स्थानीय चर के चक्र को कम करता है।) द्वारा भी प्राप्त किया जा सकता है। चूंकि व्यवहार में यह कम साधारण है। चूंकि यह कम उपयोगी है और छायांकन को हतोत्साहित किया जाता है। इस उदाहरण में <code>f</code> क्लोजर के रूप में देखा जा सकता है। जिससे कि <code>f</code> के शरीर में <code>x</code> वैश्विक नाम स्थान में <code>x</code> के लिए बाध्य है न कि <code>x</code> स्थानीय के लिए <code>g</code> होता है।
यह [[चर छायांकन]] (जो गैर-स्थानीय चर के क्षेत्र को कम करता है।) द्वारा भी प्राप्त किया जा सकता है। चूंकि व्यवहार में यह कम साधारण है। चूंकि यह कम उपयोगी है और छायांकन को हतोत्साहित किया जाता है। इस उदाहरण में <code>f</code> क्लोजर के रूप में देखा जा सकता है। जिससे कि <code>f</code> के शरीर में <code>x</code> वैश्विक नाम स्थान में <code>x</code> के लिए बाध्य है न कि <code>x</code> स्थानीय के लिए <code>g</code> होता है।


एक्स = 0
एक्स = 0
Line 76: Line 76:
क्लोजर का उपयोग उन भाषाओं से जुड़ा हुआ है। जहां कार्य [[प्रथम श्रेणी की वस्तु|प्रथम श्रेणी की वस्तुएं]] हैं। जिसमें उच्च-क्रम के फंक्शन के परिणाम के रूप में फंक्शन को वापस किया जा सकता है या अन्य फंक्शन कॉलों के लिए तर्क के रूप में पारित किया जा सकता है। यदि मुक्त चर वाले कार्य प्रथम श्रेणी के हैं। तब वापस लौटने से क्लोजर हो जाता है। इसमें लिस्प (प्रोग्रामिंग भाषा) और [[एमएल (प्रोग्रामिंग भाषा)]], जैसी [[कार्यात्मक प्रोग्रामिंग भाषाएं|कार्यात्मक प्रोग्रामिंग भाषाओं]] के साथ-साथ जूलिया, पायथन और रस्ट जैसी अनेक आधुनिक, बहु-प्रतिमान भाषाएं सम्मिलित हैं। [[कॉलबैक (कंप्यूटर प्रोग्रामिंग)]] के साथ क्लोजर का भी अधिकांशतः उपयोग किया जाता है। विशेष रूप से [[आयोजन प्रबंधकर्ता]] के लिए, जैसे कि [[जावास्क्रिप्ट|जावालिपि]] में, जहां उनका उपयोग [[गतिशील वेब पेज]] के साथ बातचीत के लिए किया जाता है।
क्लोजर का उपयोग उन भाषाओं से जुड़ा हुआ है। जहां कार्य [[प्रथम श्रेणी की वस्तु|प्रथम श्रेणी की वस्तुएं]] हैं। जिसमें उच्च-क्रम के फंक्शन के परिणाम के रूप में फंक्शन को वापस किया जा सकता है या अन्य फंक्शन कॉलों के लिए तर्क के रूप में पारित किया जा सकता है। यदि मुक्त चर वाले कार्य प्रथम श्रेणी के हैं। तब वापस लौटने से क्लोजर हो जाता है। इसमें लिस्प (प्रोग्रामिंग भाषा) और [[एमएल (प्रोग्रामिंग भाषा)]], जैसी [[कार्यात्मक प्रोग्रामिंग भाषाएं|कार्यात्मक प्रोग्रामिंग भाषाओं]] के साथ-साथ जूलिया, पायथन और रस्ट जैसी अनेक आधुनिक, बहु-प्रतिमान भाषाएं सम्मिलित हैं। [[कॉलबैक (कंप्यूटर प्रोग्रामिंग)]] के साथ क्लोजर का भी अधिकांशतः उपयोग किया जाता है। विशेष रूप से [[आयोजन प्रबंधकर्ता]] के लिए, जैसे कि [[जावास्क्रिप्ट|जावालिपि]] में, जहां उनका उपयोग [[गतिशील वेब पेज]] के साथ बातचीत के लिए किया जाता है।


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


=== प्रथम श्रेणी के कार्य ===
=== प्रथम श्रेणी के कार्य ===
{{further|प्रथम श्रेणी समारोह}}
{{further|प्रथम श्रेणी समारोह}}


क्लोजर सामान्यतः प्रथम श्रेणी के फंक्शन के साथ भाषाओं में दिखाई देते हैं। चूँकि दूसरे शब्दों में, ऐसी भाषाएं फंक्शन को तर्कों के रूप में पारित करने में सक्षम बनाती हैं। अतः फंक्शन कॉल से वापस आती हैंऔर चर नामों से बंधी होती हैं इत्यादि। साधारण रूप से जैसे शृंखला के प्रकार और पूर्णांक होते है। उदाहरण के लिए, निम्नलिखित योजना (प्रोग्रामिंग भाषा) फंक्शन पर विचार कर सकते है।
क्लोजर सामान्यतः प्रथम श्रेणी के फंक्शन के साथ भाषाओं में दिखाई देते हैं। चूँकि दूसरे शब्दों में, ऐसी भाषाएं फंक्शन को तर्कों के रूप में पारित करने में सक्षम बनाती हैं। अतः फंक्शन कॉल से वापस आती हैं और चर नामों से बंधी होती हैं। साधारण रूप से जैसे शृंखला के प्रकार और पूर्णांक होते है। उदाहरण के लिए, निम्नलिखित योजना (प्रोग्रामिंग भाषा) फंक्शन पर विचार कर सकते है।
; विक्रय गई कम से कम सीमा प्रतियों वाली सभी पुस्तकों की सूची लौटाएं।
; विक्रय गई कम से कम सीमा प्रतियों वाली सभी पुस्तकों की सूची लौटाएं।
(परिभाषित करें (सर्वाधिक विक्रय होने वाली पुस्तकों की सीमा)
(परिभाषित करें (सर्वाधिक विक्रय होने वाली पुस्तकों की सीमा)
Line 88: Line 88:
   (>= (पुस्तक-बिक्री बही) सीमा))
   (>= (पुस्तक-बिक्री बही) सीमा))
   पुस्तक सूची))
   पुस्तक सूची))
इस उदाहरण में, [[लैम्ब्डा (प्रोग्रामिंग)]] <code>(लैम्ब्डा (पुस्तक) {>= (पुस्तक-बिक्री पुस्तक) सीमा)}</code> <code>श्रेष्ठ-बिक्री-पुस्तक</code> फंक्शन के अंदर दिखाई देता है जब लैम्ब्डा अभिव्यक्ति का मूल्यांकन किया जाता है। तब योजना लैम्ब्डा अभिव्यक्ति के लिए कोड और संदर्भ से मिलकर क्लोजर बनाती है। <code>सीमा</code> चर, जो लैम्ब्डा अभिव्यक्ति के अंदर मुक्त चर है।
इस उदाहरण में, [[लैम्ब्डा (प्रोग्रामिंग)]] <code>(लैम्ब्डा (पुस्तक) {>= (पुस्तक-बिक्री पुस्तक) सीमा)}</code> <code>श्रेष्ठ-बिक्री-पुस्तक</code> फंक्शन के अंदर दिखाई देता है जब लैम्ब्डा अभिव्यक्ति का मूल्यांकन किया जाता है। तब योजना लैम्ब्डा अभिव्यक्ति के लिए कोड और संदर्भ से मिलकर <code>सीमा</code> चर क्लोजर बनाती है। जो लैम्ब्डा अभिव्यक्ति के अंदर मुक्त चर है।


इसके पश्चात् क्लोजर को <code>निस्पंदन</code> फंक्शन में भेज दिया जाता है। जो यह निर्धारित करने के लिए बार-बार कॉल करता है कि कौन सी पुस्तकें परिणाम सूची में जोड़ी जानी हैं और कौन सी छोड़ी जानी हैं। चूंकि क्लोजर में <code>सीमा</code>का संदर्भ होता है। अतः अधिकांशतः जब फ़िल्टर इसे कॉल करता है तब वह उस चर का उपयोग कर सकता है। फंक्शन <code>निस्पंदन</code> पूर्ण प्रकार से भिन्न फ़ाइल में परिभाषित किया जा सकता है।
इसके पश्चात् क्लोजर को <code>निस्पंदन</code> फंक्शन में भेज दिया जाता है। जो यह निर्धारित करने के लिए बार-बार कॉल करता है कि कौन सी पुस्तकें परिणाम सूची में जोड़ी जानी हैं और कौन सी छोड़ी जानी हैं। चूंकि क्लोजर में <code>सीमा</code>का संदर्भ होता है। अतः अधिकांशतः जब फ़िल्टर इसे कॉल करता है तब वह उस चर का उपयोग कर सकता है। फंक्शन <code>निस्पंदन</code> पूर्ण प्रकार से भिन्न फ़ाइल में परिभाषित किया जा सकता है।


यहाँ उसी उदाहरण को जावालिपि में फिर से लिखा गया है। क्लोजर के लिए समर्थन के साथ अन्य लोकप्रिय भाषा,
यहाँ उसी उदाहरण को जावालिपि में फिर से लिखा गया है। अतः क्लोजर के लिए समर्थन के साथ अन्य लोकप्रिय भाषा,


विक्रय की गई कम से कम 'दहलीज' प्रतियों वाली सभी पुस्तकों की सूची को वापस करना होता है।
विक्रय की गई कम से कम 'दहलीज' प्रतियों वाली सभी पुस्तकों की सूची को वापस किया जाता है।


सबसे अधिक विक्रय होने वाली पुस्तकें (दहलीज) कार्य करता है। {
सबसे अधिक विक्रय होने वाली पुस्तकें (सीमा) कार्य करता है। {
   वापसी पुस्तक सूची.<code>निस्पंदन</code> (
   वापसी पुस्तक सूची.<code>निस्पंदन</code> (
   फंक्शन (पुस्तक) {पुस्तक वापस करें। विक्रय> = सीमा; }
   फंक्शन (पुस्तक) {पुस्तक वापस करें। विक्रय> = सीमा; }
Line 102: Line 102:
}
}


<code>लैम्ब्डा</code> के अतिरिक्त <code>फंक्शन</code> कीवर्ड का प्रयोग यहा किया जाता है और वैश्विक <code>निस्पंदन</code> फंक्शन के अतिरिक्त <code>ऐरे.निस्पंदन</code> विधि<ref>{{cite web | url = https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter | title = array.filter | work = Mozilla Developer Center | date = 10 January 2010 | access-date = 2010-02-09}}</ref> का उपयोग किया जाता है। किन्तु संरचना और कोड का प्रभाव समान होता है। फंक्शन क्लोजर बना सकता है और इसे वापस कर सकता है। जैसा कि निम्नलिखित उदाहरण में है।
<code>लैम्ब्डा</code> के अतिरिक्त <code>फंक्शन</code> संपर्क का प्रयोग यहा किया जाता है और वैश्विक <code>निस्पंदन</code> फंक्शन के अतिरिक्त <code>ऐरे.निस्पंदन</code> विधि<ref>{{cite web | url = https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter | title = array.filter | work = Mozilla Developer Center | date = 10 January 2010 | access-date = 2010-02-09}}</ref> का उपयोग किया जाता है। किन्तु संरचना और कोड का प्रभाव समान होता है। फंक्शन क्लोजर बना सकता है और इसे वापस कर सकता है। जैसा कि निम्नलिखित उदाहरण में है।


// फंक्शन वापस करता है जो एफ के व्युत्पन्न का अनुमान लगाता है।
// फंक्शन वापस करता है जो एफ के व्युत्पन्न का अनुमान लगाता है।
Line 123: Line 123:
=== अन्य उपयोग ===
=== अन्य उपयोग ===
क्लोजर के अनेक उपयोग हैं:
क्लोजर के अनेक उपयोग हैं:
* चूंकि क्लोजर होने से मूल्यांकन में देरी होती है।—अर्थात्, वह तब तक कुछ नहीं करते जब तक उन्हें बुलाया नहीं जाता है।—उनका उपयोग नियंत्रण संरचनाओं को परिभाषित करने के लिए किया जा सकता है। उदाहरण के लिए, लघु वार्ता की सभी मानक नियंत्रण संरचनाएँ है। जिनमें शाखाएँ (यदि/तब/अन्य) और छोरों (जबकि और के लिए) सम्मिलित हैं। उन वस्तुओं का उपयोग करके परिभाषित की जाती हैं। जिनकी विधि क्लोजर स्वीकार करते हैं। उपयोक्ता अपनी स्वयं की नियंत्रण संरचनाओं को भी सरलता से परिभाषित कर सकते हैं।
* चूंकि क्लोजर होने से मूल्यांकन में देरी होती है।अर्थात्, वह तब तक कुछ नहीं करते जब तक उन्हें बुलाया नहीं जाता है।उनका उपयोग नियंत्रण संरचनाओं को परिभाषित करने के लिए किया जा सकता है। उदाहरण के लिए, लघु वार्ता की सभी मानक नियंत्रण संरचनाएँ है। जिनमें शाखाएँ (यदि/तब/अन्य) और छोरों (जबकि और के लिए) सम्मिलित हैं। उन वस्तुओं का उपयोग करके परिभाषित की जाती हैं। जिनकी विधि क्लोजर स्वीकार करते हैं। उपयोक्ता अपनी स्वयं की नियंत्रण संरचनाओं को भी सरलता से परिभाषित कर सकते हैं।
* उन भाषाओं में जो कार्य को प्रयुक्त करती हैं। वातावरण के समीप अनेक फंक्शन उत्पन्न किए जा सकते हैं, जिससे वह उस योजना में वातावरण को परिवर्तित करके व्यक्तिगत रूप से संवाद करने में सक्षम हो जाते हैं।
* उन भाषाओं में जो कार्य को प्रयुक्त करती हैं। वातावरण के समीप अनेक फंक्शन उत्पन्न किए जा सकते हैं, जिससे वह उस योजना में वातावरण को परिवर्तित करके व्यक्तिगत रूप से संवाद करने में सक्षम हो जाते हैं।


Line 150: Line 150:
भाषा कार्यान्वयन सरलता से पूर्ण क्लोजर का समर्थन नहीं कर सकता है। यदि इसका कार्यावधि स्मृति मॉडल रैखिक [[स्टैक-आधारित मेमोरी आवंटन|समुदाय-आधारित स्मृति आवंटन]] पर सभी [[स्वचालित चर]] आवंटित करता है। ऐसी भाषाओं में, फंक्शन के वापस आने पर किसी फंक्शन के स्वचालित स्थानीय चरों को हटा दिया जाता है। चूँकि, क्लोजर के लिए यह आवश्यक है कि इसके द्वारा संदर्भित नि: शुल्क चरों संलग्न फंक्शन के निष्पादन से बचे रहते है। अतः उन चरों को आवंटित किया जाना चाहिए। जिससे कि वह तब तक बने रहता है जब तक कि उनकी आवश्यकता नही होती है। सामान्यतः समुदाय के अतिरिक्त संचय आवंटन के माध्यम से और उनके जीवनकाल को प्रबंधित किया जाता है। जिससे कि वह तब तक जीवित रहता है। जब तक कि उन्हें संदर्भित करने वाले सभी क्लोजर उपयोग नही होते है।
भाषा कार्यान्वयन सरलता से पूर्ण क्लोजर का समर्थन नहीं कर सकता है। यदि इसका कार्यावधि स्मृति मॉडल रैखिक [[स्टैक-आधारित मेमोरी आवंटन|समुदाय-आधारित स्मृति आवंटन]] पर सभी [[स्वचालित चर]] आवंटित करता है। ऐसी भाषाओं में, फंक्शन के वापस आने पर किसी फंक्शन के स्वचालित स्थानीय चरों को हटा दिया जाता है। चूँकि, क्लोजर के लिए यह आवश्यक है कि इसके द्वारा संदर्भित नि: शुल्क चरों संलग्न फंक्शन के निष्पादन से बचे रहते है। अतः उन चरों को आवंटित किया जाना चाहिए। जिससे कि वह तब तक बने रहता है जब तक कि उनकी आवश्यकता नही होती है। सामान्यतः समुदाय के अतिरिक्त संचय आवंटन के माध्यम से और उनके जीवनकाल को प्रबंधित किया जाता है। जिससे कि वह तब तक जीवित रहता है। जब तक कि उन्हें संदर्भित करने वाले सभी क्लोजर उपयोग नही होते है।


यह बताता है कि सामान्यतः मूल रूप से क्लोजर का समर्थन करने वाली भाषाएं कचरा संग्रह (कंप्यूटर विज्ञान) का उपयोग क्यों करती हैं। चूँकि विकल्प गैर-स्थानीय चर के मैनुअल स्मृति प्रबंधन हैं। (स्पष्ट रूप से संचय पर आवंटन और किए जाने पर मुक्त) या यदि समुदाय आवंटन का उपयोग करते हैं। तब भाषा के लिए यह स्वीकार करने के लिए कि कुछ उपयोग के स्थितियों [[अपरिभाषित व्यवहार]] की ओर ले जाते है। लटकने वाले सूचक के कारण सी ++ 11 में लैम्ब्डा अभिव्यक्ति के रूप में मुक्त स्वचालित चर<ref>''[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf Lambda Expressions and Closures]'' C++ Standards Committee. 29 February 2008.</ref> या जीएनयू सी में स्थिर फंक्शन के रूप में मुक्त स्वचालित चर होता है।<ref>GCC Manual, [https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html 6.4 Nested Functions], "If you try to call the nested function through its address after the containing function exits, all hell breaks loose. If you try to call it after a containing scope level exits, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it's not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe."</ref> फनार्ग समस्या (या कार्यात्मक तर्क समस्या) सी या सी ++ जैसी समुदाय-आधारित प्रोग्रामिंग भाषा में प्रथम श्रेणी की वस्तुओं के रूप में फंक्शन को प्रयुक्त करने में कठिनाई का वर्णन करती है। इसी प्रकार [[डी (प्रोग्रामिंग भाषा)]] संस्करण 1 में, यह माना जाता है कि प्रोग्रामर जानता है कि [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] और स्वचालित स्थानीय चर के साथ क्या करना है। चूंकि इसकी परिभाषा के चक्र से लौटने के पश्चात् उनके संदर्भ अमान्य हो जाते है। (स्वचालित स्थानीय चर ढेर पर हैं।) - यह अभी भी अनेक उपयोगी कार्यात्मक पैटर्न की अनुमति देता है। किन्तु जटिल स्थितियों के लिए चर के स्पष्ट संचय आवंटन की आवश्यकता होती है। डी संस्करण 2 ने यह पता लगाने के द्वारा हल किया कि कौन से चर को ढेर पर संग्रहीत किया जाना है और स्वचालित आवंटन करता है। चूंकि डी कचरा संग्रह का उपयोग करता है। अतः दोनों संस्करणों में, चर के उपयोग को ट्रैक करने की कोई आवश्यकता नहीं है, चूंकि वह समीप होते हैं।
यह बताता है कि सामान्यतः मूल रूप से क्लोजर का समर्थन करने वाली भाषाएं कचरा संग्रह (कंप्यूटर विज्ञान) का उपयोग क्यों करती हैं। चूँकि विकल्प गैर-स्थानीय चर के मैनुअल स्मृति प्रबंधन हैं। (स्पष्ट रूप से संचय पर आवंटन और किए जाने पर मुक्त) या यदि समुदाय आवंटन का उपयोग करते हैं। तब भाषा के लिए यह स्वीकार करने के लिए कि कुछ उपयोग के स्थितियों [[अपरिभाषित व्यवहार]] की ओर ले जाते है। लटकने वाले सूचक के कारण सी ++ 11 में लैम्ब्डा अभिव्यक्ति के रूप में मुक्त स्वचालित चर<ref>''[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf Lambda Expressions and Closures]'' C++ Standards Committee. 29 February 2008.</ref> या जीएनयू सी में स्थिर फंक्शन के रूप में मुक्त स्वचालित चर होता है।<ref>GCC Manual, [https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html 6.4 Nested Functions], "If you try to call the nested function through its address after the containing function exits, all hell breaks loose. If you try to call it after a containing scope level exits, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it's not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe."</ref> फनार्ग समस्या (या कार्यात्मक तर्क समस्या) सी या सी ++ जैसी समुदाय-आधारित प्रोग्रामिंग भाषा में प्रथम श्रेणी की वस्तुओं के रूप में फंक्शन को प्रयुक्त करने में कठिनाई का वर्णन करती है। इसी प्रकार [[डी (प्रोग्रामिंग भाषा)]] संस्करण 1 में, यह माना जाता है कि प्रोग्रामर जानता है कि [[प्रतिनिधिमंडल (प्रोग्रामिंग)]] और स्वचालित स्थानीय चर के साथ क्या करना है। चूंकि इसकी परिभाषा के क्षेत्र से लौटने के पश्चात् उनके संदर्भ अमान्य हो जाते है। (स्वचालित स्थानीय चर ढेर पर हैं।) - यह अभी भी अनेक उपयोगी कार्यात्मक पैटर्न की अनुमति देता है। किन्तु जटिल स्थितियों के लिए चर के स्पष्ट संचय आवंटन की आवश्यकता होती है। डी संस्करण 2 ने यह पता लगाने के द्वारा हल किया कि कौन से चर को ढेर पर संग्रहीत किया जाना है और स्वचालित आवंटन करता है। चूंकि डी कचरा संग्रह का उपयोग करता है। अतः दोनों संस्करणों में, चर के उपयोग को ट्रैक करने की कोई आवश्यकता नहीं है, चूंकि वह समीप होते हैं।


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


एमएल में, स्थानीय चर शाब्दिक रूप से सीमित होते हैं और अतः समुदाय-जैसे मॉडल को परिभाषित करते है। चूंकि वह मूल्यों के लिए बाध्य हैं और वस्तुओं के लिए नहीं, अतः कार्यान्वयन इन मानों को क्लोजर की डेटा संरचना में कॉपी करने के लिए स्वतंत्र है जो कि अदृश्य प्रोग्रामर है।
एमएल में, स्थानीय चर शाब्दिक रूप से सीमित होते हैं और अतः समुदाय-जैसे मॉडल को परिभाषित करते है। चूंकि वह मूल्यों के लिए बाध्य हैं और वस्तुओं के लिए नहीं, अतः कार्यान्वयन इन मानों को क्लोजर की डेटा संरचना में कॉपी करने के लिए स्वतंत्र है जो कि अदृश्य प्रोग्रामर है।
Line 164: Line 164:


=== शाब्दिक वातावरण ===
=== शाब्दिक वातावरण ===
जैसा कि भिन्न-भिन्न भाषाओं में हमेशा शाब्दिक वातावरण की सामान्य परिभाषा नहीं होती है, उनके क्लोजर होने की परिभाषा भी भिन्न हो सकती है। शाब्दिक पर्यावरण की सामान्य रूप से आयोजित न्यूनतम परिभाषा इसे चक्र में बाध्यकारी सभी नामों के समूह के रूप में परिभाषित करती है और यह किसी भी भाषा में क्लोजर होने पर कब्जा करना पड़ता है। चूँकि [[चर (प्रोग्रामिंग)]] आबद्धिंग का अर्थ भी भिन्न होता है। अनिवार्य भाषाओं में, चर स्मृति में सापेक्ष स्थानों से जुड़ते हैं जो मूल्यों को संग्रहीत कर सकते हैं। चूँकि आबद्धिंग का सापेक्ष स्थान कार्यावधि पर परिवर्तितता नहीं होता है, किन्तु सीमित स्थिति में मान परिवर्तित हो सकता है। ऐसी भाषाओं में, चूंकि क्लोजर आबद्धिंग को अधिकृत करता है। चर पर कोई भी ऑपरेशन, चाहे क्लोजर से किया गया हो या नहीं, उसी रिलेटिव स्मृति स्थिति पर किया जाता है। इसे अधिकांशतः चर को संदर्भ द्वारा अधिकृत करना कहा जाता है। यहां ईसीएमए लिपि में अवधारणा को चित्रित करने वाला उदाहरण दिया गया है। जो ऐसी ही भाषा है।
जैसा कि भिन्न-भिन्न भाषाओं में हमेशा शाब्दिक वातावरण की सामान्य परिभाषा नहीं होती है, उनके क्लोजर होने की परिभाषा भी भिन्न हो सकती है। शाब्दिक पर्यावरण की सामान्य रूप से आयोजित न्यूनतम परिभाषा इसे क्षेत्र में बाध्यकारी सभी नामों के समूह के रूप में परिभाषित करती है और यह किसी भी भाषा में क्लोजर होने पर कब्जा करना पड़ता है। चूँकि [[चर (प्रोग्रामिंग)]] आबद्धिंग का अर्थ भी भिन्न होता है। अनिवार्य भाषाओं में, चर स्मृति में सापेक्ष स्थानों से जुड़ते हैं जो मूल्यों को संग्रहीत कर सकते हैं। चूँकि आबद्धिंग का सापेक्ष स्थान कार्यावधि पर परिवर्तितता नहीं होता है, किन्तु सीमित स्थिति में मान परिवर्तित हो सकता है। ऐसी भाषाओं में, चूंकि क्लोजर आबद्धिंग को अधिकृत करता है। चर पर कोई भी ऑपरेशन, चाहे क्लोजर से किया गया हो या नहीं, उसी रिलेटिव स्मृति स्थिति पर किया जाता है। इसे अधिकांशतः चर को संदर्भ द्वारा अधिकृत करना कहा जाता है। यहां ईसीएमए लिपि में अवधारणा को चित्रित करने वाला उदाहरण दिया गया है। जो ऐसी ही भाषा है।


// जावालिपि
// जावालिपि
Line 201: Line 201:
वार असीमित गेट एक्स = मापांक.गेट एक्स,
वार असीमित गेट एक्स = मापांक.गेट एक्स,


कंसोल.लॉग (असीमित गेट एक्स ()); // फंक्शन को वैश्विक चक्र में प्रयुक्त किया जाता है।
कंसोल.लॉग (असीमित गेट एक्स ()); // फंक्शन को वैश्विक क्षेत्र में प्रयुक्त किया जाता है।


// अपरिभाषित उत्सर्जित करता है चूंकि 'एक्स' वैश्विक चक्र में निर्दिष्ट नहीं है।
// अपरिभाषित उत्सर्जित करता है चूंकि 'एक्स' वैश्विक क्षेत्र में निर्दिष्ट नहीं है।


वार सीमित गेट एक्स = असीमित गेट एक्स.आबद्ध (मापांक), // वस्तु मापांक को क्लोजर के रूप में निर्दिष्ट किया जाता है।
वार सीमित गेट एक्स = असीमित गेट एक्स.आबद्ध (मापांक), // वस्तु मापांक को क्लोजर के रूप में निर्दिष्ट किया जाता है।
Line 211: Line 211:
=== उदाहरण 2: बाध्य चर के लिए आकस्मिक संदर्भ ===
=== उदाहरण 2: बाध्य चर के लिए आकस्मिक संदर्भ ===


इस उदाहरण के लिए अपेक्षित व्यवहार यह होता है कि क्लिक किए जाने पर प्रत्येक लिंक को अपनी आईडी छोड़नी होती है। किन्तु चर 'ई' उपरोक्त चक्र से जुड़ा हुआ है और क्लिक पर मुक्त मूल्यांकन किया गया है। वास्तव में यह होता है कि प्रत्येक क्लिक आयोजन के अंतिम तत्व की आईडी को लूप के अंत में बंधे 'तत्व' में उत्सर्जित करता है।<ref>{{cite web |title=Closures |url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake |website=MDN Web Docs |access-date=20 November 2018}}</ref>
इस उदाहरण के लिए अपेक्षित व्यवहार यह होता है कि क्लिक किए जाने पर प्रत्येक लिंक को अपनी आईडी छोड़नी होती है। किन्तु चर 'ई' उपरोक्त क्षेत्र से जुड़ा हुआ है और क्लिक पर मुक्त मूल्यांकन किया गया है। वास्तव में यह होता है कि प्रत्येक क्लिक आयोजन के अंतिम तत्व की आईडी को लूप के अंत में बंधे 'तत्व' में उत्सर्जित करता है।<ref>{{cite web |title=Closures |url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake |website=MDN Web Docs |access-date=20 November 2018}}</ref>


वार तत्व = दस्तावेज़.के तत्व को पाने के लिए टैग नाम ('ए')
वार तत्व = दस्तावेज़.के तत्व को पाने के लिए टैग नाम ('ए')
Line 219: Line 219:
<nowiki>के लिए (तत्वों का संस्करण) {ई.ऑन क्लिक = फंक्शन हैंडल () {अलर्ट (ई.आईडी);}}</nowiki>
<nowiki>के लिए (तत्वों का संस्करण) {ई.ऑन क्लिक = फंक्शन हैंडल () {अलर्ट (ई.आईडी);}}</nowiki>


यहाँ पुनः परिवर्तनशील <code>ई</code> का उपयोग करके ब्लॉक के चक्र से बंधे होने पर <code>हैंडल.बाँधना (यह)</code> या <code>लेट</code> कीवर्ड की आवश्यकता होती है।
यहाँ पुनः परिवर्तनशील <code>ई</code> का उपयोग करके ब्लॉक के क्षेत्र से बंधे होने पर <code>हैंडल.बाँधना (यह)</code> या <code>लेट</code> संपर्क की आवश्यकता होती है।


दूसरी ओर, अनेक कार्यात्मक भाषाएं, जैसे एमएल (प्रोग्रामिंग भाषा), चर को सीधे मानों से बांधती हैं। इस स्थितियों में, चूंकि बाध्य होने के पश्चात् चर के मान को परिवर्तित करने की कोई विधि नहीं है। अतः राज्य को क्लोजर करने के मध्य साझा करने की कोई आवश्यकता नहीं है। - वह केवल उसी मान का उपयोग करते हैं। इसे अधिकांशतः चर को मान द्वारा अधिकृत करना कहा जाता है। सामान्यतः जावा के स्थानीय और अनाम वर्ग भी इस श्रेणी में आते हैं। - उन्हें <code>अंतिम</code> होने के लिए अधिकृत किए गए स्थानीय चर की आवश्यकता होती है। जिसका अर्थ यह भी है कि राज्य को साझा करने की कोई आवश्यकता नहीं है।
दूसरी ओर, अनेक कार्यात्मक भाषाएं, जैसे एमएल (प्रोग्रामिंग भाषा), चर को सीधे मानों से बांधती हैं। इस स्थितियों में, चूंकि बाध्य होने के पश्चात् चर के मान को परिवर्तित करने की कोई विधि नहीं है। अतः राज्य को क्लोजर करने के मध्य साझा करने की कोई आवश्यकता नहीं है। - वह केवल उसी मान का उपयोग करते हैं। इसे अधिकांशतः चर को मान द्वारा अधिकृत करना कहा जाता है। सामान्यतः जावा के स्थानीय और अनाम वर्ग भी इस श्रेणी में आते हैं। - उन्हें <code>अंतिम</code> होने के लिए अधिकृत किए गए स्थानीय चर की आवश्यकता होती है। जिसका अर्थ यह भी है कि राज्य को साझा करने की कोई आवश्यकता नहीं है।
Line 332: Line 332:


==== स्थिर फंक्शन और फंक्शन सूचक (सी) ====
==== स्थिर फंक्शन और फंक्शन सूचक (सी) ====
जीसीसी विस्तार के साथ, [https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html स्थिर फंक्शन] का उपयोग किया जा सकता है और फंक्शन सूचक क्लोजर का अनुकरण कर सकता है। अतः फंक्शन युक्त चक्र से बाहर नही होता है। निम्न उदाहरण अमान्य है। चूंकि <code>योजक</code> शीर्ष-स्तरीय परिभाषा है। (संकलक संस्करण के आधार पर, यह अनुकूलन के बिना संकलित होने पर सही परिणाम उत्पन्न कर सकता है। अर्थात <code>-O0</code>):
जीसीसी विस्तार के साथ, [https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html स्थिर फंक्शन] का उपयोग किया जा सकता है और फंक्शन सूचक क्लोजर का अनुकरण कर सकता है। अतः फंक्शन युक्त क्षेत्र से बाहर नही होता है। निम्न उदाहरण अमान्य है। चूंकि <code>योजक</code> शीर्ष-स्तरीय परिभाषा है। (संकलक संस्करण के आधार पर, यह अनुकूलन के बिना संकलित होने पर सही परिणाम उत्पन्न कर सकता है। अर्थात <code>-O0</code>):
#सम्मिलित < स्टूडियो.एच>
#सम्मिलित < स्टूडियो.एच>


Line 463: Line 463:
ऐप्पल ने सी, सी ++, वस्तुिव-सी 2.0 और मैक ओएस एक्स 10.6 "स्नो लेपर्ड" और आईओएस 4.0 में गैर-मानक विस्तार के रूप में ब्लॉक, क्लोजर के रूप प्रस्तुत किया जाता है। ऐप्पल ने जीसीसी और क्लैंग कंपाइलर्स के लिए अपना कार्यान्वयन उपलब्ध कराया है।
ऐप्पल ने सी, सी ++, वस्तुिव-सी 2.0 और मैक ओएस एक्स 10.6 "स्नो लेपर्ड" और आईओएस 4.0 में गैर-मानक विस्तार के रूप में ब्लॉक, क्लोजर के रूप प्रस्तुत किया जाता है। ऐप्पल ने जीसीसी और क्लैंग कंपाइलर्स के लिए अपना कार्यान्वयन उपलब्ध कराया है।


शाब्दिक ब्लॉक और ब्लॉक करने के लिए सूचक को चिह्नित किया गया है। <code>^</code> ब्लॉक बनाया जाता है। तब सामान्य स्थानीय चर मूल्य द्वारा कब्जा कर लिया जाता है और केवल पढ़ने के लिए ब्लॉक के अंदर होता है। संदर्भ द्वारा अधिकृत किए जाने वाले चरों को <code>__block</code> चिह्नित किया गया है। जिन ब्लॉकों को उनके द्वारा बनाए गए चक्र से बाहर बने रहने की आवश्यकता है। उन्हें कॉपी करने की आवश्यकता हो सकती है।<ref>{{cite web|url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html|title=Blocks Programming Topics|author=Apple Inc.|access-date=2011-03-08}}</ref><ref>{{cite web|url=http://thirdcog.eu/pwcblocks/|title=Programming with C Blocks on Apple Devices|author=Joachim Bengtsson|date=7 July 2010|access-date=2010-09-18|archive-url=https://web.archive.org/web/20101025034928/http://thirdcog.eu/pwcblocks/|archive-date=25 October 2010|url-status=dead}}</ref>
शाब्दिक ब्लॉक और ब्लॉक करने के लिए सूचक को चिह्नित किया गया है। <code>^</code> ब्लॉक बनाया जाता है। तब सामान्य स्थानीय चर मूल्य द्वारा कब्जा कर लिया जाता है और केवल पढ़ने के लिए ब्लॉक के अंदर होता है। संदर्भ द्वारा अधिकृत किए जाने वाले चरों को <code>__block</code> चिह्नित किया गया है। जिन ब्लॉकों को उनके द्वारा बनाए गए क्षेत्र से बाहर बने रहने की आवश्यकता है। उन्हें कॉपी करने की आवश्यकता हो सकती है।<ref>{{cite web|url=https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html|title=Blocks Programming Topics|author=Apple Inc.|access-date=2011-03-08}}</ref><ref>{{cite web|url=http://thirdcog.eu/pwcblocks/|title=Programming with C Blocks on Apple Devices|author=Joachim Bengtsson|date=7 July 2010|access-date=2010-09-18|archive-url=https://web.archive.org/web/20101025034928/http://thirdcog.eu/pwcblocks/|archive-date=25 October 2010|url-status=dead}}</ref>


टाइपपीफ इंट (^ इंटब्लॉक) (),
टाइपपीफ इंट (^ इंटब्लॉक) (),
Line 527: Line 527:
डी संस्करण 1 में सीमित क्लोजर समर्थन है। उदाहरण के लिए, उपरोक्त कोड सही रूप से कार्य नहीं करता है, चूंकि चर ए समुदाय पर है, और परीक्षण () से लौटने के पश्चात्, यह अब इसका उपयोग करने के लिए मान्य नहीं है। (संभवतः डीजी () के माध्यम से फू को कॉल करना, 'वापसी करेगा यादृच्छिक 'पूर्णांक)। इसे ढेर पर चर 'ए' को स्पष्ट रूप से आवंटित करके, या सभी आवश्यक क्लोजर चरों को संग्रहीत करने के लिए संरचनाएं या कक्षाओ का उपयोग करके हल किया जा सकता है और उसी कोड को प्रयुक्त करने वाली विधि से प्रतिनिधि का निर्माण किया जा सकता है। क्लोजर को अन्य फंक्शन में पारित किया जा सकता है, जब तक कि वह केवल तब तक उपयोग किए जाते हैं जब संदर्भित मान अभी भी मान्य होते हैं (उदाहरण के लिए कॉलबैक पैरामीटर के रूप में क्लोजर के साथ किसी अन्य फंक्शन को कॉल करना), और सामान्य डेटा प्रोसेसिंग कोड लिखने के लिए उपयोगी होते हैं। अतः यह सीमा, व्यवहार में, अधिकांशतः कोई समस्या नहीं होती है।
डी संस्करण 1 में सीमित क्लोजर समर्थन है। उदाहरण के लिए, उपरोक्त कोड सही रूप से कार्य नहीं करता है, चूंकि चर ए समुदाय पर है, और परीक्षण () से लौटने के पश्चात्, यह अब इसका उपयोग करने के लिए मान्य नहीं है। (संभवतः डीजी () के माध्यम से फू को कॉल करना, 'वापसी करेगा यादृच्छिक 'पूर्णांक)। इसे ढेर पर चर 'ए' को स्पष्ट रूप से आवंटित करके, या सभी आवश्यक क्लोजर चरों को संग्रहीत करने के लिए संरचनाएं या कक्षाओ का उपयोग करके हल किया जा सकता है और उसी कोड को प्रयुक्त करने वाली विधि से प्रतिनिधि का निर्माण किया जा सकता है। क्लोजर को अन्य फंक्शन में पारित किया जा सकता है, जब तक कि वह केवल तब तक उपयोग किए जाते हैं जब संदर्भित मान अभी भी मान्य होते हैं (उदाहरण के लिए कॉलबैक पैरामीटर के रूप में क्लोजर के साथ किसी अन्य फंक्शन को कॉल करना), और सामान्य डेटा प्रोसेसिंग कोड लिखने के लिए उपयोगी होते हैं। अतः यह सीमा, व्यवहार में, अधिकांशतः कोई समस्या नहीं होती है।


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


=== फंक्शन वस्तु्स (सी ++) ===
=== फंक्शन वस्तु्स (सी ++) ===
सी ++ ओवरलोडिंग द्वारा समारोह वस्तुओ को परिभाषित करने में सक्षम बनाता है <code>प्रचालक()</code>. ये वस्तु कुछ सीमा तक कार्यात्मक प्रोग्रामिंग भाषा में कार्यों की भांति व्यवहार करते हैं। वे क्रम पर बनाए जा सकते हैं और इसमें राज्य सम्मिलित हो सकते हैं, लेकिन वे स्थानीय चर को बंद करने के रूप में निहित रूप से अधिकृत नहीं करते हैं। [[सी ++ 11]] के अनुसार, सी ++ भाषा भी क्लोजर का समर्थन करती है, जो एक प्रकार का समारोह वस्तु है जो लैम्ब्डा-एक्सप्रेशन नामक एक विशेष भाषा निर्माण से स्वचालित रूप से निर्मित होता है। एक सी ++ क्लोजर क्लोजर वस्तु या संदर्भ के सदस्यों के रूप में एक्सेस किए गए चर की प्रतियों को संग्रहीत करके इसके संदर्भ को अधिकृत कर सकता है। इस स्थिति में, यदि क्लोजर वस्तु संदर्भित वस्तु के सीमा से बाहर निकलता है, तो इसका आह्वान करता है <code>प्रचालक()</code> अपरिभाषित व्यवहार का कारण बनता है क्योंकि सी ++ क्लोजर उनके संदर्भ के जीवनकाल का विस्तार नहीं करते हैं।{{main|अनाम कार्य # सी ++ (सी ++ 11 के बाद से)}}
सी ++ ओवरलोडिंग द्वारा समारोह वस्तुओ को परिभाषित करने में सक्षम बनाता है <code>प्रचालक()</code>. ये वस्तु कुछ सीमा तक कार्यात्मक प्रोग्रामिंग भाषा में कार्यों की भांति व्यवहार करते हैं। वे क्रम पर बनाए जा सकते हैं और इसमें राज्य सम्मिलित हो सकते हैं, लेकिन वे स्थानीय चर को बंद करने के रूप में निहित रूप से अधिकृत नहीं करते हैं। [[सी ++ 11]] के अनुसार, सी ++ भाषा भी क्लोजर का समर्थन करती है, जो एक प्रकार का समारोह वस्तु है जो लैम्ब्डा-एक्सप्रेशन नामक एक विशेष भाषा निर्माण से स्वचालित रूप से निर्मित होता है। एक सी ++ क्लोजर क्लोजर वस्तु या संदर्भ के सदस्यों के रूप में एक्सेस किए गए चर की प्रतियों को संग्रहीत करके इसके संदर्भ को अधिकृत कर सकता है। इस स्थिति में, यदि क्लोजर वस्तु संदर्भित वस्तु के सीमा से बाहर निकलता है, तो इसका आह्वान करता है <code>प्रचालक()</code> अपरिभाषित व्यवहार का कारण बनता है क्योंकि सी ++ क्लोजर उनके संदर्भ के जीवनकाल का विस्तार नहीं करते हैं।{{main|अनाम कार्य # सी ++ (सी ++ 11 के बाद से)}}


शून्य फू (स्ट्रिंग मायनाम) {
शून्य फू (स्ट्रिंग मायनाम) {
Line 562: Line 561:
निश्चित बटन, जिससे कि जब भी उस बटन पर घटना प्रकार का उदाहरण होता है। चूंकि उपयोगकर्ता ने बटन पर क्लिक किया है। <code>एक्स</code> और <code>वाई</code>प्रक्रिया को माउस निर्देशांक के साथ तर्क के रूप में पारित किया जाता है।  
निश्चित बटन, जिससे कि जब भी उस बटन पर घटना प्रकार का उदाहरण होता है। चूंकि उपयोगकर्ता ने बटन पर क्लिक किया है। <code>एक्स</code> और <code>वाई</code>प्रक्रिया को माउस निर्देशांक के साथ तर्क के रूप में पारित किया जाता है।  


एफिल एजेंटों की मुख्य सीमा, जो उन्हें अन्य भाषाओं में क्लोजर होने से भिन्न करती है। यह है कि वह स्थानीय चर को संलग्न चक्र से संदर्भित नहीं कर सकते हैं। यह डिज़ाइन निर्णय अस्पष्टता से बचने में मदद करता है। जब क्लोजर में स्थानीय चर मान के बारे में बात की जाती है। क्या यह चर का नवीनतम मान होना चाहिए या एजेंट के बनाए जाने पर अधिकृत किया गया मान होना चाहिए? केवल <code>वर्तमान</code> (वर्तमान वस्तु का संदर्भ, के अनुरूप <code>यह</code> जावा में), इसकी विशेषताओं और एजेंट के तर्कों को एजेंट निकाय के अंदर से ही अनुलेख किया जा सकता है। एजेंट को अतिरिक्त क्लोजर ऑपरेंड प्रदान करके बाहरी स्थानीय चर के मान पारित किए जा सकते हैं।
एफिल एजेंटों की मुख्य सीमा, जो उन्हें अन्य भाषाओं में क्लोजर होने से भिन्न करती है। यह है कि वह स्थानीय चर को संलग्न क्षेत्र से संदर्भित नहीं कर सकते हैं। यह डिज़ाइन निर्णय अस्पष्टता से बचने में मदद करता है। जब क्लोजर में स्थानीय चर मान के बारे में बात की जाती है। क्या यह चर का नवीनतम मान होना चाहिए या एजेंट के बनाए जाने पर अधिकृत किया गया मान होना चाहिए? केवल <code>वर्तमान</code> (वर्तमान वस्तु का संदर्भ, के अनुरूप <code>यह</code> जावा में), इसकी विशेषताओं और एजेंट के तर्कों को एजेंट निकाय के अंदर से ही अनुलेख किया जा सकता है। एजेंट को अतिरिक्त क्लोजर ऑपरेंड प्रदान करके बाहरी स्थानीय चर के मान पारित किए जा सकते हैं।


=== सी ++ बिल्डर क्लोजर आरक्षित शब्द ===
=== सी ++ बिल्डर क्लोजर आरक्षित शब्द ===

Revision as of 10:21, 27 March 2023

प्रोग्रामिंग भाषाओं में, क्लोजर, शाब्दिक क्लोजर या फंक्शन क्लोजर भी प्रथम श्रेणी के फंक्शन के साथ भाषा में शाब्दिकी विस्तार नाम बंधन को प्रयुक्त करने की विधि है। क्रियात्मक रूप से परिचालन शब्दार्थ, क्लोजर रिकॉर्ड (कंप्यूटर विज्ञान) होता है। जो फंक्शन (कंप्यूटर विज्ञान) को पर्यावरण के साथ संग्रहित करता है।[1] चूँकि पर्यावरण मानचित्रण है। जो फंक्शन के प्रत्येक मुक्त चर को जोड़ता है। (चर जो स्थानीय रूप से उपयोग किए जाते हैं। किन्तु संलग्न क्षेत्र में परिभाषित होते हैं।) अतः मूल्य (कंप्यूटर विज्ञान) या संदर्भ (कंप्यूटर विज्ञान) के साथ जिसका नाम बंधन होने पर नाम बाध्य बनाया गया था।[lower-alpha 1] सामान्यतः साधारण फंक्शन के विपरीत, क्लोजर फंक्शन को अधिकृत किए गए चरों को उनके मूल्यों या संदर्भों की क्लोजर प्रतियों के माध्यम से प्रवेश करने की अनुमति देता है। तथापि जब फंक्शन को उनके क्षेत्र से बाहर वर्णित किया जाता है।

इतिहास और व्युत्पत्त

क्लोजर की अवधारणा को सन्न 1960 के दशक में λ-कैलकुलस में भावों के यांत्रिक मूल्यांकन के लिए विकसित किया गया था और प्रथम बार सन्न 1970 में पूर्ण प्रकार से आरपीएल प्रोग्रामिंग भाषा में भाषा सुविधा के रूप में प्रयुक्त किया गया था। जिससे कि शाब्दिक रूप से प्रथम श्रेणी के फंक्शन का समर्थन किया जा सकता था।[2]

पीटर जे. लैंडिन ने सन्न 1964 में सीमा क्लोजर को पर्यावरण भाग और नियंत्रण भाग के रूप में परिभाषित किया था। जैसा कि अभिव्यक्ति के मूल्यांकन के लिए उनकी एसईसीडी मशीन द्वारा उपयोग किया जाता है।[3] जोएल मोसेस ने लैम्ब्डा अभिव्यक्ति को संदर्भित करने के लिए क्लोजर शब्द की शुरुआत करने का श्रेय लैंडिन को दिया है। जिसके खुला बंधन (नि: शुल्क चरों) को शाब्दिक वातावरण द्वारा (या आंतरिक) क्लोजर कर दिया गया है। जिसके परिणामस्वरूप क्लोजर अभिव्यक्ति या क्लोजर होता है।[4][5] इस प्रयोग को पश्चात् में गेराल्ड जे सुस्मान और गाइ एल. स्टील, जूनियर द्वारा अपनाया गया था। जब उन्होंने सन्न 1975 में योजना (प्रोग्रामिंग भाषा) को परिभाषित किया था।[6] अतः लिस्प (प्रोग्रामिंग भाषा) का शाब्दिकी विस्तार रूपांतर और व्यापक हो गया है।

सुस्मान और हेरोल्ड एबेलसन भी सन्न 1980 के दशक में दूसरे असंबंधित अर्थ के साथ क्लोजर शब्द का उपयोग करते हैं। चूँकि ऑपरेटर की संपत्ति जो डेटा संरचना में डेटा जोड़ती है और स्थिर डेटा संरचनाओं को भी जोड़ने में सक्षम होती है। अतः यह शब्द का प्रयोग कंप्यूटर विज्ञान में पूर्व उपयोग के अतिरिक्त क्लोजर (गणित) से आता है। जिसे लेखक शब्दावली में इस ओवरलैप को "दुर्भाग्यपूर्ण" मानते हैं।[7]

अनाम कार्य

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

उदाहरण के लिए, निम्नलिखित पायथन (प्रोग्रामिंग भाषा) कोड में,

डेफ एफ (एक्स),

 डेफ जी (वाई):
 वापसी एक्स + वाई
 वापसी जी # वापसी क्लोजर।

डीईएफ़ एच (एक्स)

 वापसी लैम्ब्डा वाई: एक्स + वाई # क्लोजर लौटाएं।
  1. चरों को विशिष्ट क्लोजर नियुक्त करना होता है।

ए = एफ (1)

बी = एच (1)

  1. चरों में संग्रह किए गए क्लोजर का उपयोग करना।

ए (5) == 6 पर जोर दें।

जोर बी (5) == 6

  1. प्रथम चर से आबद्ध किए बिना क्लोजर का उपयोग करता है।

सामान्यतः a और b के मान क्लोजर होते है। जो दोनों स्थितियों में स्थिर फंक्शन को संलग्न फंक्शन से मुक्त चर के साथ वापस करके उत्पादित किया जाता है। जिससे कि मुक्त चर संलग्न फंक्शन के पैरामीटर x के मान से जुड़ जाता है। चूँकि a और b में क्लोजर कार्यात्मक रूप से समान हैं। कार्यान्वयन में एकमात्र अंतर यह है कि प्रथम स्थितियों में हमने नाम g के साथ स्थिर फंक्शन का उपयोग नाम के साथ किया था। (अज्ञात फंक्शन बनाने के लिए पाइथन संकेत शब्द लैम्ब्डाका उपयोग करके) उन्हें परिभाषित करने में यदि कोई मूल नाम प्रयुक्त होता है, वह अप्रासंगिक है।

क्लोजर किसी भी अन्य मान की भांति वह मान है। इसके चर को नियुक्त करने की आवश्यकता नहीं है और इसके अतिरिक्त इसे सीधे उपयोग किया जा सकता है। जैसा कि उदाहरण की अंतिम दो पंक्तियों में दिखाया गया है। इस उपयोग को अनाम क्लोजर माना जा सकता है।

चूँकि स्थिर फंक्शन परिभाषाएं स्वयं क्लोजर नहीं हैं। उनके समीप मुक्त चर है। जो अभी तक बाध्य नहीं है। अतः केवल संलग्न फंक्शन का मूल्यांकन पैरामीटर के मान के साथ किया जाता है। स्थिर फंक्शन सीमित का मुक्त चर होता है। जो क्लोजर बनाता है। जिसे पश्चात् में संलग्न फंक्शन से लौटाया जाता है।

अंत में, गैर-स्थानीय चर के क्षेत्र से बाहर होने पर क्लोजर केवल मुक्त चर वाले फंक्शन से प्रथक होता है। अन्यथा परिभाषित वातावरण और निष्पादन वातावरण से मेल खाते हैं और इन्हें प्रथक करने के लिए कुछ भी नहीं है। (स्थैतिक और गतिशील बाध्यकारी को प्रथक नहीं किया जा सकता है। जिससे कि नाम समान मानों को हल करते हैं।) उदाहरण के लिए, नीचे दिए गए प्रोग्राम में, मुक्त चर x (वैश्विक सीमा के साथ गैर-स्थानीय चर x के लिए बाध्य) वाले कार्यो को उसी वातावरण में निष्पादित किया जाता हैं। जहाँ x को परिभाषित किया गया है। अतः यह सारहीन है कि क्या ये वास्तव में क्लोजर हैं।

एक्स = 1

अंक = [ 1, 2, 3 ]

डेफ एफ (वाई),

 वापसी एक्स + वाई

नक्शा (एफ, अंक)

नक्शा (लैम्ब्डा वाई, एक्स + वाई, अंक)

यह अधिकांशतः फंक्शन वापसी द्वारा प्राप्त किया जाता है। चूँकि फंक्शन को गैर-स्थानीय चर के क्षेत्र में परिभाषित किया जाना चाहिए। इस स्थितियों में सामान्यतः इसका क्षेत्र g छोटा होता है।

यह चर छायांकन (जो गैर-स्थानीय चर के क्षेत्र को कम करता है।) द्वारा भी प्राप्त किया जा सकता है। चूंकि व्यवहार में यह कम साधारण है। चूंकि यह कम उपयोगी है और छायांकन को हतोत्साहित किया जाता है। इस उदाहरण में f क्लोजर के रूप में देखा जा सकता है। जिससे कि f के शरीर में x वैश्विक नाम स्थान में x के लिए बाध्य है न कि x स्थानीय के लिए g होता है।

एक्स = 0

डेफ एफ (वाई):

 वापसी एक्स + वाई

डेफ जी (जेड):

 x = 1 # स्थानीय x छाया वैश्विक x
 वापसी एफ (जेड)

जी(1) # 1 का मूल्यांकन करता है, 2 का नहीं

अनुप्रयोग

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

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

प्रथम श्रेणी के कार्य

क्लोजर सामान्यतः प्रथम श्रेणी के फंक्शन के साथ भाषाओं में दिखाई देते हैं। चूँकि दूसरे शब्दों में, ऐसी भाषाएं फंक्शन को तर्कों के रूप में पारित करने में सक्षम बनाती हैं। अतः फंक्शन कॉल से वापस आती हैं और चर नामों से बंधी होती हैं। साधारण रूप से जैसे शृंखला के प्रकार और पूर्णांक होते है। उदाहरण के लिए, निम्नलिखित योजना (प्रोग्रामिंग भाषा) फंक्शन पर विचार कर सकते है।

विक्रय गई कम से कम सीमा प्रतियों वाली सभी पुस्तकों की सूची लौटाएं।

(परिभाषित करें (सर्वाधिक विक्रय होने वाली पुस्तकों की सीमा)

 (फ़िल्टर
 (लैम्ब्डा (पुस्तक)
 (>= (पुस्तक-बिक्री बही) सीमा))
 पुस्तक सूची))

इस उदाहरण में, लैम्ब्डा (प्रोग्रामिंग) (लैम्ब्डा (पुस्तक) {>= (पुस्तक-बिक्री पुस्तक) सीमा)} श्रेष्ठ-बिक्री-पुस्तक फंक्शन के अंदर दिखाई देता है जब लैम्ब्डा अभिव्यक्ति का मूल्यांकन किया जाता है। तब योजना लैम्ब्डा अभिव्यक्ति के लिए कोड और संदर्भ से मिलकर सीमा चर क्लोजर बनाती है। जो लैम्ब्डा अभिव्यक्ति के अंदर मुक्त चर है।

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

यहाँ उसी उदाहरण को जावालिपि में फिर से लिखा गया है। अतः क्लोजर के लिए समर्थन के साथ अन्य लोकप्रिय भाषा,

विक्रय की गई कम से कम 'दहलीज' प्रतियों वाली सभी पुस्तकों की सूची को वापस किया जाता है।

सबसे अधिक विक्रय होने वाली पुस्तकें (सीमा) कार्य करता है। {

 वापसी पुस्तक सूची.निस्पंदन (
 फंक्शन (पुस्तक) {पुस्तक वापस करें। विक्रय> = सीमा; }
 );

}

लैम्ब्डा के अतिरिक्त फंक्शन संपर्क का प्रयोग यहा किया जाता है और वैश्विक निस्पंदन फंक्शन के अतिरिक्त ऐरे.निस्पंदन विधि[8] का उपयोग किया जाता है। किन्तु संरचना और कोड का प्रभाव समान होता है। फंक्शन क्लोजर बना सकता है और इसे वापस कर सकता है। जैसा कि निम्नलिखित उदाहरण में है।

// फंक्शन वापस करता है जो एफ के व्युत्पन्न का अनुमान लगाता है।

// डीएक्स के अंतराल का उपयोग करता है। जो उचित रूप से छोटा होना चाहिए।

फंक्शन व्युत्पन्न (एफ, डीएक्स) {

 वापसी फंक्शन (एक्स) {
 वापसी (एफ(एक्स + डीएक्स) - एफ(एक्स)) / डीएक्स;
 };

}

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

राज्य प्रतिनिधित्व

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

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

अन्य उपयोग

क्लोजर के अनेक उपयोग हैं:

  • चूंकि क्लोजर होने से मूल्यांकन में देरी होती है।अर्थात्, वह तब तक कुछ नहीं करते जब तक उन्हें बुलाया नहीं जाता है।उनका उपयोग नियंत्रण संरचनाओं को परिभाषित करने के लिए किया जा सकता है। उदाहरण के लिए, लघु वार्ता की सभी मानक नियंत्रण संरचनाएँ है। जिनमें शाखाएँ (यदि/तब/अन्य) और छोरों (जबकि और के लिए) सम्मिलित हैं। उन वस्तुओं का उपयोग करके परिभाषित की जाती हैं। जिनकी विधि क्लोजर स्वीकार करते हैं। उपयोक्ता अपनी स्वयं की नियंत्रण संरचनाओं को भी सरलता से परिभाषित कर सकते हैं।
  • उन भाषाओं में जो कार्य को प्रयुक्त करती हैं। वातावरण के समीप अनेक फंक्शन उत्पन्न किए जा सकते हैं, जिससे वह उस योजना में वातावरण को परिवर्तित करके व्यक्तिगत रूप से संवाद करने में सक्षम हो जाते हैं।

(फू #f परिभाषित करें)

(बार #f परिभाषित करें)

(चलो ((गुप्त-संदेश कोई नहीं))

 (समूह! फू (लैम्ब्डा (संदेश) (समूह! गुप्त-संदेश संदेश)))
 (समूह! बार (लैम्ब्डा () गुप्त-संदेश)))

(प्रदर्शन (बार)); मुद्रण करना कोई नहीं

(नई पंक्ति)

(आधी रात को मुझे गोदी से मिले)

(प्रदर्शन (बार)), मुद्रण करना मुझसे आधी रात को डॉक पर मिलते हैं।

  • नामांकन-उन्मुख प्रोग्रामिंग सिस्टम को प्रयुक्त करने के लिए क्लोजर का उपयोग किया जा सकता है।[9]

नोट: कुछ वक्ता किसी भी डेटा संरचना को कॉल करते हैं। जो विस्तार (प्रोग्रामिंग) शाब्दिक विस्तार वातावरण को क्लोजर से बांधता है। किन्तु यह शब्द सामान्यतः विशेष रूप से फंक्शन को संदर्भित करता है।

कार्यान्वयन और सिद्धांत

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

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

यह बताता है कि सामान्यतः मूल रूप से क्लोजर का समर्थन करने वाली भाषाएं कचरा संग्रह (कंप्यूटर विज्ञान) का उपयोग क्यों करती हैं। चूँकि विकल्प गैर-स्थानीय चर के मैनुअल स्मृति प्रबंधन हैं। (स्पष्ट रूप से संचय पर आवंटन और किए जाने पर मुक्त) या यदि समुदाय आवंटन का उपयोग करते हैं। तब भाषा के लिए यह स्वीकार करने के लिए कि कुछ उपयोग के स्थितियों अपरिभाषित व्यवहार की ओर ले जाते है। लटकने वाले सूचक के कारण सी ++ 11 में लैम्ब्डा अभिव्यक्ति के रूप में मुक्त स्वचालित चर[10] या जीएनयू सी में स्थिर फंक्शन के रूप में मुक्त स्वचालित चर होता है।[11] फनार्ग समस्या (या कार्यात्मक तर्क समस्या) सी या सी ++ जैसी समुदाय-आधारित प्रोग्रामिंग भाषा में प्रथम श्रेणी की वस्तुओं के रूप में फंक्शन को प्रयुक्त करने में कठिनाई का वर्णन करती है। इसी प्रकार डी (प्रोग्रामिंग भाषा) संस्करण 1 में, यह माना जाता है कि प्रोग्रामर जानता है कि प्रतिनिधिमंडल (प्रोग्रामिंग) और स्वचालित स्थानीय चर के साथ क्या करना है। चूंकि इसकी परिभाषा के क्षेत्र से लौटने के पश्चात् उनके संदर्भ अमान्य हो जाते है। (स्वचालित स्थानीय चर ढेर पर हैं।) - यह अभी भी अनेक उपयोगी कार्यात्मक पैटर्न की अनुमति देता है। किन्तु जटिल स्थितियों के लिए चर के स्पष्ट संचय आवंटन की आवश्यकता होती है। डी संस्करण 2 ने यह पता लगाने के द्वारा हल किया कि कौन से चर को ढेर पर संग्रहीत किया जाना है और स्वचालित आवंटन करता है। चूंकि डी कचरा संग्रह का उपयोग करता है। अतः दोनों संस्करणों में, चर के उपयोग को ट्रैक करने की कोई आवश्यकता नहीं है, चूंकि वह समीप होते हैं।

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

एमएल में, स्थानीय चर शाब्दिक रूप से सीमित होते हैं और अतः समुदाय-जैसे मॉडल को परिभाषित करते है। चूंकि वह मूल्यों के लिए बाध्य हैं और वस्तुओं के लिए नहीं, अतः कार्यान्वयन इन मानों को क्लोजर की डेटा संरचना में कॉपी करने के लिए स्वतंत्र है जो कि अदृश्य प्रोग्रामर है।

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

क्लोजर समवर्ती संगणना के अभिनेता मॉडल में अभिनेताओं से निकटता से संबंधित हैं। जहां फंक्शन के शाब्दिक वातावरण में मूल्यों को परिचित कहा जाता है। समवर्ती प्रोग्रामिंग भाषाओं में क्लोजर के लिए महत्वपूर्ण मुद्दा यह है कि क्या क्लोजर में चरों को सूचित किया जा सकता है और यदि तब इन अद्यतन को कैसे समक्रमिक किया जा सकता है।अभिनेता इसका समाधान प्रदान करते हैं।[12]

क्लोजर फंक्शन वस्तु से निकटता से संबंधित होता हैं। अतः पूर्व से दूसरे में परिवर्तन को निष्क्रियता या लैम्ब्डा उठाना के रूप में जाना जाता है। क्लोजर रूपांतरण भी देख सकते है।

शब्दार्थ में अंतर

शाब्दिक वातावरण

जैसा कि भिन्न-भिन्न भाषाओं में हमेशा शाब्दिक वातावरण की सामान्य परिभाषा नहीं होती है, उनके क्लोजर होने की परिभाषा भी भिन्न हो सकती है। शाब्दिक पर्यावरण की सामान्य रूप से आयोजित न्यूनतम परिभाषा इसे क्षेत्र में बाध्यकारी सभी नामों के समूह के रूप में परिभाषित करती है और यह किसी भी भाषा में क्लोजर होने पर कब्जा करना पड़ता है। चूँकि चर (प्रोग्रामिंग) आबद्धिंग का अर्थ भी भिन्न होता है। अनिवार्य भाषाओं में, चर स्मृति में सापेक्ष स्थानों से जुड़ते हैं जो मूल्यों को संग्रहीत कर सकते हैं। चूँकि आबद्धिंग का सापेक्ष स्थान कार्यावधि पर परिवर्तितता नहीं होता है, किन्तु सीमित स्थिति में मान परिवर्तित हो सकता है। ऐसी भाषाओं में, चूंकि क्लोजर आबद्धिंग को अधिकृत करता है। चर पर कोई भी ऑपरेशन, चाहे क्लोजर से किया गया हो या नहीं, उसी रिलेटिव स्मृति स्थिति पर किया जाता है। इसे अधिकांशतः चर को संदर्भ द्वारा अधिकृत करना कहा जाता है। यहां ईसीएमए लिपि में अवधारणा को चित्रित करने वाला उदाहरण दिया गया है। जो ऐसी ही भाषा है।

// जावालिपि

वार एफ, जी,

फंक्शन फू () {

 वार एक्स;
 च = फंक्शन () {वापसी ++एक्स; };
 जी = फंक्शन () {वापसी --एक्स; };
 एक्स = 1;
 चेतावनी ('फू के अंदर, एफ को कॉल करें):' + एफ ());

}

फू (); // 2

चेतावनी ('जी को कॉल करें):' + जी ()); // 1 (--एक्स)

चेतावनी ('जी को कॉल करें):' + जी ()); // 0 (--एक्स)

चेतावनी ('कॉल टू एफ ():' + एफ ()); // 1 (++एक्स)

चेतावनी ('कॉल टू एफ ():' + एफ ()); // 2 (++एक्स)

फंक्शन फू और चरों एफ और जी द्वारा संदर्भित क्लोजर सभी स्थानीय चर एक्स द्वारा दर्शाए गए समान सापेक्ष स्मृति स्थान का उपयोग करते हैं।

कुछ उदाहरणों में उपरोक्त व्यवहार अवांछनीय हो सकता है और भिन्न शाब्दिक समापन को बांधना आवश्यक है। पुनः ईसीएमए लिपि में फंक्शन.बाँधना() का उपयोग करके किया जाता है।

=== उदाहरण 1: अनसीमित चर === का संदर्भ[13]

वार मापांक = {

 एक्स: 42,
 गेट एक्स: फंक्शन () {इसे वापस करें। एक्स; }

}

वार असीमित गेट एक्स = मापांक.गेट एक्स,

कंसोल.लॉग (असीमित गेट एक्स ()); // फंक्शन को वैश्विक क्षेत्र में प्रयुक्त किया जाता है।

// अपरिभाषित उत्सर्जित करता है चूंकि 'एक्स' वैश्विक क्षेत्र में निर्दिष्ट नहीं है।

वार सीमित गेट एक्स = असीमित गेट एक्स.आबद्ध (मापांक), // वस्तु मापांक को क्लोजर के रूप में निर्दिष्ट किया जाता है।

कंसोल.लॉग (सीमित गेट एक्स ()), // 42 का उत्सर्जन करता है।

उदाहरण 2: बाध्य चर के लिए आकस्मिक संदर्भ

इस उदाहरण के लिए अपेक्षित व्यवहार यह होता है कि क्लिक किए जाने पर प्रत्येक लिंक को अपनी आईडी छोड़नी होती है। किन्तु चर 'ई' उपरोक्त क्षेत्र से जुड़ा हुआ है और क्लिक पर मुक्त मूल्यांकन किया गया है। वास्तव में यह होता है कि प्रत्येक क्लिक आयोजन के अंतिम तत्व की आईडी को लूप के अंत में बंधे 'तत्व' में उत्सर्जित करता है।[14]

वार तत्व = दस्तावेज़.के तत्व को पाने के लिए टैग नाम ('ए')

// त्रुटिपूर्ण: ई 'फॉर' लूप वाले फंक्शन के लिए बाध्य है, न कि हैंडल को क्लोजर करने के लिए होते है।

के लिए (तत्वों का संस्करण) {ई.ऑन क्लिक = फंक्शन हैंडल () {अलर्ट (ई.आईडी);}}

यहाँ पुनः परिवर्तनशील का उपयोग करके ब्लॉक के क्षेत्र से बंधे होने पर हैंडल.बाँधना (यह) या लेट संपर्क की आवश्यकता होती है।

दूसरी ओर, अनेक कार्यात्मक भाषाएं, जैसे एमएल (प्रोग्रामिंग भाषा), चर को सीधे मानों से बांधती हैं। इस स्थितियों में, चूंकि बाध्य होने के पश्चात् चर के मान को परिवर्तित करने की कोई विधि नहीं है। अतः राज्य को क्लोजर करने के मध्य साझा करने की कोई आवश्यकता नहीं है। - वह केवल उसी मान का उपयोग करते हैं। इसे अधिकांशतः चर को मान द्वारा अधिकृत करना कहा जाता है। सामान्यतः जावा के स्थानीय और अनाम वर्ग भी इस श्रेणी में आते हैं। - उन्हें अंतिम होने के लिए अधिकृत किए गए स्थानीय चर की आवश्यकता होती है। जिसका अर्थ यह भी है कि राज्य को साझा करने की कोई आवश्यकता नहीं है।

कुछ भाषाएँ आपको चर या उसके स्थान के मान को अधिकृत करने के मध्य चयन करने में सक्षम बनाती हैं। उदाहरण के लिए, सी ++ 11 में, अधिकृत किए गए चर [&] या [=] तब घोषित किए जाते हैं। जिसका अर्थ है संदर्भ द्वारा या साथ में कब्जा कर लिया गया है।

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

-- हास्केल

फू :: भिन्नात्मक ए=> ए-> ए-> (ए-> ए)

फू एक्स वाई = (\जेड -> जेड + आर)

 जहां आर = एक्स / वाई

एफ :: भिन्नात्मक ए=> ए-> ए

एफ = फू 1 0

मुख्य = मुद्रण करना (एफ 123)

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

क्लोजर छोड़ना

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

लघु वार्ता

फू

 | एक्सएस |
 एक्सएसs:= #(1 2 3 4).
 एक्सएस करते हैं: [:एक्स | ^ एक्स]।
 ^ 0

छड़

 ट्रांसक्रिप्ट शो: (स्वत: फू मुद्रण करना डोरी) मुद्रण करना 1

// ईसीएमए लिपि

फंक्शन फू () {

 वार एक्सएस = [1, 2, 3, 4];
 एक्सएस.प्रत्येक के लिए (फंक्शन (एक्स) {वापसी एक्स;});
 वापसी 0;

}

चेतावनी (फू ()); // मुद्रण करना 0

उपरोक्त कोड के टुकड़े भिन्न प्रकार से व्यवहार करते है। चूंकि लघु वार्ता ^ ऑपरेटर और जावालिपि वापसी ऑपरेटर अनुरूप नहीं हैं। ईसीएमए लिपि उदाहरण में, वापसी एक्स का नया पुनरावृति प्रारंभ करने के लिए आंतरिक समापन को छोड़ देता है जिससे कि लघु वार्ता उदाहरण में, ^एक्स लूप को निरस्त कर देता है और विधि फू से वापस आ जाता है।

अधिकांशतः सामान्य लिस्प निर्माण प्रदान करता है। जो उपरोक्त फंक्शन में से किसी को व्यक्त कर सकता है। लिस्प (वापसी-फू से एक्स) लघु वार्ता ^एक्स के रूप में व्यवहार करता है। जिससे कि लिस्प (वापसी-शून्य से एक्स) जावालिपि वापसी एक्स के रूप में व्यवहार करता है। अतः, लघु वार्ता अधिकृत किए गए एस्केप निरंतरता को उस सीमा तक जीवित रहने के लिए संभव बनाता है। जिसमें इसे सफलतापूर्वक प्रयुक्त किया जा सकता है। विचार करना,

लघु वार्ता

फू

 ^[ :एक्स | ^एक्स]

छड़

 | एफ |
 च�:= स्वयं फू.
 एफ मान: 123 त्रुटि!

जब क्लोजर विधि द्वारा फू द्वारा वापस किए गये क्लोजर को प्रयुक्त किया जाता है, यह क्लोजर बनाने वाले फू के आह्वान से मान वापस करने का प्रयास करता है। चूँकि वह कॉल पहले ही वापस आ चुकी है और लघु वार्ता विधि मंगलाचरण मॉडल अनेक वापसी की सुविधा के लिए स्पेगेटी ढेर अनुशासन का पालन नहीं करता है। इस ऑपरेशन के परिणामस्वरूप त्रुटि होती है।

कुछ भाषाएँ, जैसे रूबी (प्रोग्रामिंग भाषा), प्रोग्रामर को वापसी कब्जा करने की विधि चुनने में सक्षम बनाती हैं। रूबी में उदाहरण,

  1. माणिक
  1. प्रोक का उपयोग कर क्लोजर कर सकते है।

डेफ फू

 एफ = प्रो सी.नई { फू से अंदर की खरीद से वापसी}
 एफ.कॉल # नियंत्रण फू को यहां छोड़ देता है।
 फू से वापसी

अंत

  1. लैम्ब्डा का उपयोग करके क्लोजर कर सकते है।

डेफ बार

 एफ = लैम्ब्डा {लैम्ब्डा से वापसी वापसी}
 एफ.कॉल # नियंत्रण यहां बार नहीं छोड़ता है।
 बार से वापसी वापसी

अंत

पुट फू # मुद्रण करना फू फ्रॉम अंदर प्रो

बार डालता है # बार से वापसी मुद्रण करता है।


दोनों प्रो सी.नई और लैम्ब्डा इस उदाहरण में क्लोजर बनाने के विधि हैं। किन्तु इस प्रकार से बनाए गए क्लोजर वापसी कथन के शब्दार्थ इसके संबंध में भिन्न हैं।

योजना (प्रोग्रामिंग भाषा) में, वापसी नियंत्रण की परिभाषा और कार्यक्षेत्र स्पष्ट है। ( उदाहरण के लिए केवल अनैतिक रूप से 'वापसी' नाम दिया गया है।) निम्नलिखित रूबी प्रतिरूप का सीधा अनुवाद है।

योजना

(कॉल/सीसी कॉल-साथ-वर्तमान-निरंतरता को परिभाषित कर सकते है।)

(परिभाषित करें (फू)

 (कॉल/सीसी
 (लैम्ब्डा (वापसी)
 (परिभाषित करें (एफ) (अंदर से फू से वापसी))
 (एफ)�; नियंत्रण यहां फू मुक्त कर देता है।
 (फू से वापसी))))

(परिभाषित करें (बार)

 (कॉल/सीसी
 (लैम्ब्डा (वापसी)
 (परिभाषित करें (एफ) (कॉल/सीसी (लैम्ब्डा (वापसी) (लैम्ब्डा से वापसी))))
 (एफ)�; नियंत्रण यहां बार नहीं मुक्त करता है।
 (बार से वापसी))))

(प्रदर्शन (फू)), मुद्रण करना अंदर से फू से वापस आते हैं।

(नई पंक्ति)

(प्रदर्शन (बार)); मुद्रण करना बार से वापस आते हैं।

क्लोजर-जैसी संरचनाएं

सामान्यतः कुछ भाषाओं में विशेषताएं होती हैं। जो क्लोजर के व्यवहार का अनुकरण करती हैं। जावा, सी++, उद्देश्य सी, सी#, वीबी.नेट और डी जैसी भाषाओं में, ये विशेषताएँ भाषा के वस्तु-उन्मुख प्रतिमान का परिणाम हैं।

कॉलबैक (सी)

सामान्यतः कुछ पुस्तकालय कॉलबैक सी (प्रोग्रामिंग भाषा) समर्थन करते हैं। पुस्तकालय के साथ कॉलबैक (कंप्यूटर विज्ञान) पंजीकृत करते समय इसे कभी-कभी दो मान प्रदान करके कार्यान्वित किया जाता है। उपयोगकर्ता की पसंद के अनैतिक डेटा के लिए फ़ंक्शन सूचक और और शून्य* सूचक होता है। जब पुस्तकालय कॉलबैक फंक्शन निष्पादित करता है तब यह डेटा सूचक के साथ गुजरता है। यह कॉलबैक को राज्य को बनाये रखने और पुस्तकालय के साथ पंजीकृत होने के समय कैप्चर की गई जानकारी को संदर्भित करने में सक्षम बनाता है। मुहावरा कार्यक्षमता में क्लोजर होने के समान है। किन्तु वाक्य - विन्यास में नहीं शून्य* सूचक टाइप सुरक्षित नहीं है, चूँकि यह सी मुहावरा सी #, हास्केल या एमएल में टाइप-सुरक्षित क्लोजर से भिन्न है।

 शून्य* डीई> सूचक प्रकार की सुरक्षा नहीं है अतः यह सी

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

स्थिर फंक्शन और फंक्शन सूचक (सी)

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

  1. सम्मिलित < स्टूडियो.एच>

टाइपपीफ इंट (*एफएन_इंट_टू_इंट)(इंट); // फंक्शन का प्रकार इंट->इंट

एफएन_इंट_टू_इंट योजक (पूर्णांक संख्या) {

 इंट ऐड (इंट मान) { वापसी मान + नंबर; }
 वापसी और जोड़ें; // और ऑपरेटर यहाँ वैकल्पिक है चूंकि सी में फंक्शन का नाम सूचक है जो स्वयं की ओर संकेत करता है।

}

पूर्णांक मुख्य (शून्य) {

 एफएन_इंट_टू_इंट ऐड10 = योजक (10);
 मुद्रण करनाफ (% डी \ एन, 10 (1) जोड़ें);
 वापसी 0;

}

किन्तु चल योजक (और, वैकल्पिक रूप से,टाइपपीफ) में मुख्य इसे वैध बनाता है।

  1. सम्मिलित <स्टूडियो.एच>

पूर्णांक मुख्य (शून्य) {

 टाइपपीफ इंट (*एफएन_इंट_टू_इंट)(इंट); // फंक्शन का प्रकार इंट->इंट
 
 एफएन_इंट_टू_इंट योजक (पूर्णांक संख्या) {
 इंट ऐड (इंट मान) { वापसी मान + नंबर; }
 वापसी जोड़ें;
 }
 
 एफएन_इंट_टू_इंट ऐड10 = योजक (10);
 मुद्रण करनाफ (% डी \ एन, 10 (1) जोड़ें);
 वापसी 0;

}

यदि इसे क्रियान्वित किया जाता है तब यह आशा के अनुसार 11 मुद्रण करता है।

स्थानीय वर्ग और लैम्ब्डा फंक्शन (जावा)

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

वर्ग गणना विंडो जेफ्रेम का विस्तार करता है। {

 व्यक्तिगत अस्थिर इंट परिणाम;
 // ...
 सार्वजनिक शून्य गणना भिन्न-भिन्न विकेन्द्रीकृत (अंतिम यूआरआई यूरी) {
 // अभिव्यक्ति नया चलाने योग्य () {...} 'चलाने योग्य' इंटरफ़ेस को प्रयुक्त करने वाला अनाम वर्ग है।
 नया सूत्र(
 नया चलाने योग्य () {
 शून्य रन () {
 // यह अंतिम स्थानीय चर पढ़ सकता है:
 गणना (यूरी);
 // यह संलग्न वर्ग के व्यक्तिगत क्षेत्रों तक पहुँच सकता है:
 परिणाम = परिणाम + 10;
 }
 }
 )।प्रारंभ करना();
 }

}

अंतिम चरों को अधिकृत करने से आप चरों के मान अनुसार अधिकृत कर सकते है। यदि आप जिस चर को अधिकृत करना चाहते हैं वह गैर-अंतिम है आप हमेशा कक्षा के ठीक पूर्व अस्थायी अंतिम चर में कॉपी कर सकते हैं।

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

जावा 8 के लैम्ब्डा भावों के आगमन के साथ,[15] क्लोजर के कारण उपरोक्त कोड को निष्पादित कर सकता है।

वर्ग गणना विंडो जेफ्रेम का विस्तार करता है। {

 व्यक्तिगत अस्थिर इंट परिणाम;
 // ...
 सार्वजनिक शून्य गणना भिन्न-भिन्न विकेन्द्रीकृत (अंतिम यूआरआई यूरी) {
 // कोड () -> { /* कोड */} क्लोजर है।
 नया विकेन्द्रीकृत (() -> {
 गणना (यूरी);
 परिणाम = परिणाम + 10;
 })।प्रारंभ करना();
 }

}

स्थानीय वर्ग प्रकार के आंतरिक वर्ग हैं जो विधि के शरीर के अंदर घोषित किए जाते हैं। जावा आंतरिक कक्षाओं का भी समर्थन करता है जिन्हें संलग्न वर्ग के गैर-स्थैतिक सदस्यों के रूप में घोषित किया जाता है।[16] उन्हें सामान्यतः आंतरिक कक्षाओं के रूप में संदर्भित किया जाता है।[17] इन्हें संलग्न वर्ग के शरीर में परिभाषित किया गया है और संलग्न वर्ग के आवृत्ति चरों तक पूर्ण पहुंच है। इन इंस्टेंस चरों के लिए उनके बंधन के कारण, विशेष वाक्य - विन्यास का उपयोग करके संलग्न वर्ग के उदाहरण के लिए स्पष्ट बंधन के साथ आंतरिक वर्ग को केवल तत्काल किया जा सकता है।[18] <वाक्यविन्यास प्रकाश लैंग = जावा> पब्लिक कक्षाये संलग्न कक्षाये {

 / * आंतरिक वर्ग को परिभाषित करें * /
 पब्लिक कक्षाओं अंदर कक्षाओं {
 सार्वजनिक पूर्णांक वृद्धि और वापसी काउंटर () {
 वापसी काउंटर ++;
 }
 }
 व्यक्तिगत इंट काउंटर;
 {
 काउंटर = 0;
 }
 सार्वजनिक इंट गेट काउंटर () {
 वापसी काउंटर;
 }
 सार्वजनिक स्थैतिक शून्य मुख्य (String [] args) {
 EnclosingClass enclosingClassInstance = new EnclosingClass();
 / * उदाहरण के लिए बाध्यकारी के साथ आंतरिक वर्ग को तुरंत चालू करें */
 EnclosingClass.InnerClass innerClassInstance =
 enclosingClassInstance.new InnerClass();
 for (int i = enclosingClassInstance.getCounter();
 (i = innerClassInstance.incrementAndReturnCounter ()) <10;
 /* इंक्रीमेंट चरण छोड़ा गया */) {
 System.out.println (i);
 }
 }

}

निष्पादन पर, यह 0 से 9 तक के पूर्णांकों को मुद्रण करना करता है। इस प्रकार के वर्ग को स्थिर वर्ग के साथ भ्रमित न करने के लिए सावधान रहते है, जो उसी प्रकार से घोषित किया जाता है जैसे स्थैतिक संशोधक के उपयोग के साथ किया जाता है। उनका वांछित प्रभाव नहीं है, बल्कि केवल वह वर्ग हैं जिनके समीप संलग्न वर्ग में परिभाषित कोई विशेष बंधन नहीं है।

जावा संस्करण इतिहास जावा_8 के रूप में, जावा प्रथम श्रेणी की वस्तुओं के रूप में फंक्शन का समर्थन करता है। इस रूप के लैम्ब्डा भावों को फंक्शन<टी,यू> प्रकार का माना जाता है। जहां टी डोमेन है और यू छवि प्रकार है। व्यंजक को इसके .apply(T t) विधि से कॉल किया जा सकता है। किन्तु मानक विधि कॉल के साथ नहीं किया जाता है।

सार्वजनिक स्थैतिक शून्य मुख्य (String [] args) {

 फंक्शन <स्ट्रिंग, पूर्णांक> लंबाई = एस -> s.length ();
 System.out.println (लंबाई। प्रयुक्त करें (हैलो, दुनिया!)); // 13 मुद्रण करना करेगा।

}

ब्लॉक (सी, सी ++, वस्तुिव-सी 2.0)

ऐप्पल ने सी, सी ++, वस्तुिव-सी 2.0 और मैक ओएस एक्स 10.6 "स्नो लेपर्ड" और आईओएस 4.0 में गैर-मानक विस्तार के रूप में ब्लॉक, क्लोजर के रूप प्रस्तुत किया जाता है। ऐप्पल ने जीसीसी और क्लैंग कंपाइलर्स के लिए अपना कार्यान्वयन उपलब्ध कराया है।

शाब्दिक ब्लॉक और ब्लॉक करने के लिए सूचक को चिह्नित किया गया है। ^ ब्लॉक बनाया जाता है। तब सामान्य स्थानीय चर मूल्य द्वारा कब्जा कर लिया जाता है और केवल पढ़ने के लिए ब्लॉक के अंदर होता है। संदर्भ द्वारा अधिकृत किए जाने वाले चरों को __block चिह्नित किया गया है। जिन ब्लॉकों को उनके द्वारा बनाए गए क्षेत्र से बाहर बने रहने की आवश्यकता है। उन्हें कॉपी करने की आवश्यकता हो सकती है।[19][20]

टाइपपीफ इंट (^ इंटब्लॉक) (),

इंटब्लॉक डाउनकाउंटर (इंट स्टार्ट) {

__ ब्लॉक इंट आई = स्टार्ट;

वापसी ^ इंट () {

वापसी मैं--;

} कॉपी] ऑटोरिलीज];

}

इंटब्लॉक एफ = डाउनकाउंटर (5),

एनएसएलओजी (@% डी, एफ ()),

एनएसएलओजी (@% डी, एफ ()),

एनएसएलओजी (@% डी, एफ ()),

प्रतिनिधि (सी #, वीबी.नेट, डी)

सी शार्प (प्रोग्रामिंग भाषा) | सी # अनाम विधि और लैम्ब्डा अभिव्यक्ति क्लोजर का समर्थन करते हैं।

वार डेटा = नया [] {1, 2, 3, 4},

वार गुणक = 2,

वार परिणाम = डेटा। चयन करें (x => x * गुणक),

मूल दृश्य .नेट, जिसमें सी# के समान अनेक भाषा सुविधाएँ हैं, क्लोजर के साथ लैम्ब्डा अभिव्यक्ति का भी समर्थन करता है।

मंद डेटा = {1, 2, 3, 4}

मंद गुणक = 2

मंद परिणाम = डेटा। चयन करें (फंक्शन (x) x * गुणक)

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

ऑटो टेस्ट 1 () {

 इंट ए = 7;
 वापसी प्रतिनिधि () {वापसी + 3; }; // अनाम प्रतिनिधि निर्माण

}

ऑटो टेस्ट 2 () {

 इंट ए = 20;
 इंट फू () {वापसी ए + 5; } // आंतरिक कार्य
 वापसी और फू; // प्रतिनिधि बनाने का दूसरा विधि

}

शून्य बार () {

 ऑटो डीजी = टेस्ट1 ();
 डीजी (); // = 10 // ठीक है, टेस्ट1.एक्लोजर में है और अभी भी उपस्तिथ है।
 डीजी = टेस्ट2 ();
 डीजी (); // = 25 // ठीक है, टेस्ट2.एक्लोजर होने की स्थिति में है और अभी भी उपस्तिथ है।

}

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

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

फंक्शन वस्तु्स (सी ++)

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

शून्य फू (स्ट्रिंग मायनाम) {

 इंट वाई;
 वेक्टर <स्ट्रिंग> एन;
 // ...
 ऑटो मैं = एसटीडी::find_if(n.begin(), n.end(),
 // यह लैम्ब्डा अभिव्यक्ति है:
 [&] (स्थिरांक स्ट्रिंग और s) {वापसी s! = myname && s.size ()> y; }
 );
 // 'i' अब या तब 'n.end ()' है या 'n' में पहले स्ट्रिंग को इंगित करता है
 // जो 'myname' के बराबर नहीं है और जिसकी लंबाई 'y' से अधिक है

}

इनलाइन एजेंट (एफिल)

एफिल (प्रोग्रामिंग भाषा) में क्लोजर को परिभाषित करने वाले इनलाइन एजेंट सम्मिलित हैं। इनलाइन एजेंट रूटीन का प्रतिनिधित्व करने वाली वस्तु है। जिसे रूटीन इन-लाइन का कोड देकर परिभाषित किया जाता है। उदाहरण के लिए, में

ओके_बटन.क्लिक_आयोजन.सदस्यता लें (

एजेंट (एक्स, वाई: पूर्णांक) करते हैं।

मानचित्र.देश_एट_निर्देशांक (एक्स, वाई).प्रदर्शन,

अंत

)

सदस्यता लेने का तर्क एजेंट एजेंट है। जो दो तर्कों के साथ प्रक्रिया का प्रतिनिधित्व करता है। प्रक्रिया देश को संबंधित निर्देशांक पर ढूंढती है और इसेक्लिक_आयोजन के लिए प्रदर्शित करती है। पूरे एजेंट को ईवेंट प्रकार की सदस्यता दी गई है।

निश्चित बटन, जिससे कि जब भी उस बटन पर घटना प्रकार का उदाहरण होता है। चूंकि उपयोगकर्ता ने बटन पर क्लिक किया है। एक्स और वाईप्रक्रिया को माउस निर्देशांक के साथ तर्क के रूप में पारित किया जाता है।

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

सी ++ बिल्डर क्लोजर आरक्षित शब्द

एम्बरकाडेरो सी++ निर्माता फंक्शन सूचक के समान वाक्य - विन्यास वाली विधि को सूचक प्रदान करने के लिए आरक्षित शब्द _ क्लोजर प्रदान करता है।[21]

मानक सी में आप एलिख सकते हैं टाइपपीफ निम्नलिखित वाक्य - विन्यास का उपयोग करके फंक्शन प्रकार के सूचक के लिए कार्य करता है।

इपप  (*TMyFunctionPointer) ();

इसी प्रकार से आप घोषित कर सकते हैं ए टाइपपीफ निम्नलिखित वाक्य - विन्यास का उपयोग करने वाली विधि के लिए सूचक के लिए:<वाक्य - विन्यास प्रमुखता लंग= सी++ >

टाइपपीफ शून्य (__समापन *टी मेरी विधि सूचक) ();

यह भी देखें

टिप्पणियाँ

  1. These names most frequently refer to values, mutable variables, or functions, but can also be other entities such as constants, types, classes, or labels.


संदर्भ

  1. Sussman and Steele. "Scheme: An interpreter for extended lambda calculus". "... a data structure containing a lambda expression, and an environment to be used when that lambda expression is applied to arguments." (Wikisource)
  2. David A. Turner (2012). "Some History of Functional Programming Languages". Trends in Functional Programming '12. Section 2, note 8 contains the claim about M-expressions.
  3. P. J. Landin (1964), The mechanical evaluation of expressions
  4. Joel Moses (June 1970), The Function of FUNCTION in LISP, or Why the FUNARG Problem Should Be Called the Environment Problem, hdl:1721.1/5854, AI Memo 199, A useful metaphor for the difference between FUNCTION and QUOTE in LISP is to think of QUOTE as a porous or an open covering of the function since free variables escape to the current environment. FUNCTION acts as a closed or nonporous covering (hence the term "closure" used by Landin). Thus we talk of "open" Lambda expressions (functions in LISP are usually Lambda expressions) and "closed" Lambda expressions. [...] My interest in the environment problem began while Landin, who had a deep understanding of the problem, visited MIT during 1966–67. I then realized the correspondence between the FUNARG lists which are the results of the evaluation of "closed" Lambda expressions in LISP and ISWIM's Lambda Closures.
  5. Åke Wikström (1987). Functional Programming using Standard ML. ISBN 0-13-331968-7. The reason it is called a "closure" is that an expression containing free variables is called an "open" expression, and by associating to it the bindings of its free variables, you close it.
  6. Gerald Jay Sussman and Guy L. Steele, Jr. (December 1975), Scheme: An Interpreter for the Extended Lambda Calculus, AI Memo 349
  7. Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996). Structure and Interpretation of Computer Programs. Cambridge, MA: MIT Press. p. 98–99. ISBN 0262510871.
  8. "array.filter". Mozilla Developer Center. 10 January 2010. Retrieved 2010-02-09.
  9. "Re: FP, OO and relations. Does anyone trump the others?". 29 December 1999. Archived from the original on 26 December 2008. Retrieved 2008-12-23.
  10. Lambda Expressions and Closures C++ Standards Committee. 29 February 2008.
  11. GCC Manual, 6.4 Nested Functions, "If you try to call the nested function through its address after the containing function exits, all hell breaks loose. If you try to call it after a containing scope level exits, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it's not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe."
  12. Foundations of Actor Semantics Will Clinger. MIT Mathematics Doctoral Dissertation. June 1981.
  13. "Function.prototype.bind()". MDN Web Docs. Retrieved 20 November 2018.
  14. "Closures". MDN Web Docs. Retrieved 20 November 2018.
  15. "Lambda Expressions (The Java Tutorials)".
  16. "Nested, Inner, Member, and Top-Level Classes".
  17. "Inner Class Example (The Java Tutorials > Learning the Java Language > Classes and Objects)".
  18. "Nested Classes (The Java Tutorials > Learning the Java Language > Classes and Objects)".
  19. Apple Inc. "Blocks Programming Topics". Retrieved 2011-03-08.
  20. Joachim Bengtsson (7 July 2010). "Programming with C Blocks on Apple Devices". Archived from the original on 25 October 2010. Retrieved 2010-09-18.
  21. Full documentation can be found at http://docwiki.embarcadero.com/RADStudio/Rio/en/Closure


बाहरी संबंध