2015-06-08 13 views
9

मैं बंद करने को समझने की कोशिश कर रहा हूं, लेकिन शाब्दिक रूप से प्रत्येक एक बंद होने की परिभाषा जिसे मैं पा सकता हूं, उसी क्रिप्टिक और अस्पष्ट वाक्यांश का उपयोग करता है: " से अधिक बंद हो जाता है"।कुछ "बंद" करने का क्या अर्थ है?

बंद क्या है? "ओह, यह एक समारोह है कि पर एक और समारोह बंद कर देता है है।"

लेकिन कहीं नहीं मैं साधन क्या "पर बंद" की परिभाषा पा सकते हैं। क्या कोई बात कर सकता है कि थिंग ए के लिए थिंग बी "बंद" करने के लिए इसका क्या अर्थ है?

+0

http://en.wikipedia.org/wiki/Closure_%28computer_programming%29#History_and_etymology - आपको कुछ शुरू करने के लिए देता है। एक बंद "खुली बाइंडिंग" बंद हो जाता है। – Blorgbeard

+0

एलओएल, "* एक बंद कुछ ऐसा है जो खुली बाइंडिंग पर बंद हो जाता है। *" क्या यह कोई कम वर्णनात्मक हो सकता है?! वास्तव में?!? ** वास्तव में?!? ** ** – smeeb

+0

ठीक है आप एक बिंदु होगा अगर वह मैंने कहा या लिंक से सीधे उद्धरण था।यहां मैंने जो लिंक किया है: "एक लैम्ब्डा अभिव्यक्ति जिसका खुला बाइंडिंग (फ्री चर) को लेक्सिकल वातावरण (या बाध्य) में बंद कर दिया गया है, जिसके परिणामस्वरूप बंद अभिव्यक्ति या बंद हो गया है"। – Blorgbeard

उत्तर

5

एक बंद एक कोड सूचक और एक पर्यावरण सूचक शामिल है जो एक जोड़ी है। पर्यावरण सूचक में दिए गए फ़ंक्शन के सभी निःशुल्क चर शामिल होते हैं। उदाहरण के लिए: a और b:

fun f(a, b) = 
    let fun g(c, d) = a + b + c + d 
    in g end 

val g = f(1, 2) 
val result = g(3, 4) (*should be 10*) 

समारोह g दो मुक्त चर होते हैं। यदि आप मुक्त चर शब्द से परिचित नहीं हैं, तो यह एक चर है जिसे फ़ंक्शन के दायरे में परिभाषित नहीं किया गया है। इस संदर्भ में, पर से अधिक कुछ, किसी फ़ंक्शन से एक फ्री चर के किसी भी घटना को हटाने का मतलब है। उपरोक्त उदाहरण बंद करने के लिए अच्छी प्रेरणा प्रदान करता है। जब फ़ंक्शन f रिटर्न होता है, तो हमें याद रखने में सक्षम होना चाहिए कि a और b के मान बाद में क्या हैं। जिस तरह से इस संकलित किया गया है, एक कोड सूचक है और इस तरह के रूप में सभी मुक्त चर, जिसमें एक रिकार्ड के रूप में समारोह g के इलाज के लिए है:

fun g(c, d, env) = env.a + env.b + c + d 
fun f(a, b, env) = (g, {a = a, b = b}) 
val (g, gEnv) = f(1, 2) 
val result = g(3, 4, gEnv) 

जब हम समारोह g लागू होते हैं, हम पर्यावरण कि जब बुला वापस आ गया था की आपूर्ति फ़ंक्शन f। ध्यान दें कि अब g फ़ंक्शन एक चर के किसी भी घटना है जो इसके दायरे में परिभाषित नहीं है। हम आमतौर पर एक शब्द कहते हैं जिसमें बंद के रूप में कोई भी निःशुल्क चर नहीं है। आप अभी भी स्पष्ट नहीं कर रहे हैं, तो मैट शायद http://matt.might.net/articles/closure-conversion/

+0

यह नहीं होना चाहिए: _ फ़ंक्शन 'g' में दो निःशुल्क चर शामिल हैं: 'a' और' b'._? आपने कहा कि उसके बाद एक फ्री वैरिएबल वह है जो __wasn't__ को दायरे में परिभाषित नहीं किया गया है? – Sehnsucht

+0

हां, खेद है कि एक टाइपो था। धन्यवाद! – Matt

2

पर बंद रूपांतरण की गहराई स्पष्टीकरण में एक उत्कृष्ट है apple documentation से

क्लोजर कार्यक्षमता के आसपास पारित किया जा सकता है और अपने कोड में इस्तेमाल की संयमी खंड हैं । स्विफ्ट में बंदरगाह सी और उद्देश्य-सी में और अन्य प्रोग्रामिंग भाषाओं में लैम्ब्डा के समान हैं।

लेकिन इसका क्या अर्थ है?

इसका मतलब है कि एक बंद चर और किस संदर्भ में उसे परिभाषित किया गया है के स्थिरांक कैप्चर करता है, पर उन चर और स्थिरांक को बंद करने के रूप में करने के लिए भेजा।

मुझे उम्मीद है कि इससे मदद मिलती है!

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