कॉल-विद-करंट-कॉन्टीनुअशन

स्कीम (प्रोग्रामिंग लैंग्वेज) कंप्यूटर प्रोग्रामिंग लैंग्वेज में, प्रक्रिया (कंप्यूटर विज्ञान) कॉल-विद-करंट-कॉन्टीनुअशन, संक्षिप्त कॉल/सीसी, का उपयोग नियंत्रण प्रवाह ऑपरेटर के रूप में किया जाता है। इसे कई अन्य प्रोग्रामिंग लैंग्वेजों द्वारा अपनाया गया है।

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

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

कंप्यूटर विज्ञान में, इस प्रकार की अंतर्निहित प्रोग्राम स्थिति को वस्तु के रूप में दृश्यमान बनाना रीफिकेशन (कंप्यूटर विज्ञान) कहा जाता है। (स्कीम (प्रोग्रामिंग लैंग्वेज) कॉन्टीनुअशन या कार्यों को प्रयुक्त करने के मध्य वाक्यात्मक रूप से अंतर नहीं करती है।)

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

उदाहरण
जैसा कि अगले उदाहरण में दिखाया गया है, कॉल/सीसी का उपयोग सी -स्टाइल लैंग्वेजों (प्रोग्रामिंग लैंग्वेज) से ज्ञात रिटर्न स्टेटमेंट के फ़ंक्शन का अनुकरण करने के लिए किया जा सकता है, जो स्कीम (प्रोग्रामिंग लैंग्वेज) में लुप्त है:

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

अगले उदाहरण में, कॉल/सीसी का उपयोग दो बार किया जाता है: एक बार पहले उदाहरण की तरह रिटर्न कॉन्टीनुअशन उत्पन्न करने के लिए और एक बार वस्तुओं की सूची के माध्यम से पुनरावृत्ति को निलंबित करने के लिए:

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

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

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

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

गैर-रचनात्मक तर्क से संबंध
प्रमाण और फंक्शनों के मध्य करी-हावर्ड पत्राचार कॉल/सीसी को पीयर्स के नियम से जोड़ता है, जो अंतर्ज्ञानवादी तर्क को गैर-रचनात्मक, मौलिक तर्क ((α → β) → α) → α तक विस्तारित करता है। यहां, ((α → β) → α) फ़ंक्शन f का प्रकार है, जो या तो सीधे α प्रकार का मान लौटा सकता है या प्रकार (α → β) की कॉन्टीनुअशन के लिए तर्क प्रयुक्त कर सकता है। चूंकि कॉन्टीनुअशन प्रयुक्त होने पर उपस्थित संदर्भ हटा दिया जाता है, इसलिए प्रकार β का उपयोग कभी नहीं किया जाता है और इसे ⊥, खाली प्रकार के रूप में लिया जा सकता है।

दोहरे निषेध उन्मूलन का सिद्धांत ((α → ⊥) → ⊥) → α कॉल-सीसी के एक प्रकार के बराबर है जो अपेक्षा करता है कि इसके तर्क f सदैव सामान्य रूप से मूल्य वापस किए बिना करंट कॉन्टीनुअशन का मूल्यांकन करता है। मौलिक तर्क को अंतर्ज्ञानवादी तर्क में एम्बेड करना कॉन्टीनुअशन से निकलने वाली स्टाइल के अनुवाद से संबंधित है।

कॉल/सीसी प्रयुक्त करने वाली लैंग्वेजएँ

 * स्कीम (प्रोग्रामिंग लैंग्वेज)
 * रैकेट (प्रोग्रामिंग लैंग्वेज)
 * मानक एमएल
 * मोनाड की कॉन्टीनुअशन में हास्केल (प्रोग्रामिंग लैंग्वेज)।
 * रूबी (प्रोग्रामिंग लैंग्वेज)
 * अनलंबा
 * सी++
 * आर प्रोग्रामिंग

यह भी देखें

 * गो-टू
 * कंटिन्यूएशन-पासिंग स्टाइल
 * फाइबर (कंप्यूटर विज्ञान)

बाहरी संबंध

 * A short introduction to
 * Definition of  in the Scheme spec
 * Humorous explanation of  from Rob Warnock in Usenet's
 * Cooperative multitasking in Scheme using Call-CC