स्कीम (प्रोग्रामिंग भाषा)

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

स्कीम की भाषा को आधिकारिक आईईईई मानक में मानकीकृत किया गया है और वास्तविक मानक जिसे कलनविधि भाषा स्कीम (आरएनआरएस) पर संशोधित सूची कहा जाता है। व्यापक रूप से कार्यान्वित मानक आर5आरएस (1998) है। स्कीम का सबसे हाल ही में स्वीकृत मानक आर7आरएस-छोटा (2013) है। 2007 में अधिक विस्तृत और मॉड्यूलर आर6आरएस की पुष्टि की गई थी। दोनों आर5आरएस से अपने वंश का पता लगाते हैं; नीचे दी गई समयरेखा अनुसमर्थन के कालानुक्रमिक क्रम को दर्शाती है।

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

आर6आरएस
2006 में आर6आरएस मानक तैयार करने के लक्ष्य के साथ, 2003 की स्कीम कार्यशाला में नई भाषा मानकीकरण प्रक्रिया प्रारंभ हुई। यह प्रक्रिया एकमत के पहले के आरएनआरएस दृष्टिकोण से अलग हो गई।

आर6आरएस में मानक मॉड्यूल प्रणाली है, जो मूल भाषा और पुस्तकालयों के बीच विभाजन की अनुमति देता है। आर6आरएस विनिर्देशन के कई ड्राफ्ट जारी किए गए, अंतिम संस्करण R5.97RS था। सफल वोट के परिणामस्वरूप 28 अगस्त, 2007 को घोषित नए मानक का अनुसमर्थन हुआ।

वर्तमान में विभिन्न स्कीम कार्यान्वयनों की नवीनतम रिलीज़ आर6आरएस मानक का समर्थन करता है। आर6आरएस के लिए प्रस्तावित निहित रूप से चरणबद्ध पुस्तकालयों का पोर्टेबल संदर्भ कार्यान्वयन है, जिसे वाक्य-विन्यास कहा जाता है, जो विभिन्न पुराने स्कीम कार्यान्वयनों पर ठीक से लोड और बूटस्ट्रैप करता है। रेफ नाम = वाक्य-विन्यास>

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

रेफरी>

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

आर7आरएस
आर6आरएस मानक विवाद का कारण बना है क्योंकि कुछ इसे अतिसूक्ष्म दर्शन से प्रस्थान के रूप में देखते हैं। अगस्त 2009 में, स्कीम संचालन समिति, जो मानकीकरण प्रक्रिया की देखरेख करती है, ने स्कीम को दो भाषाओं में विभाजित करने की पक्षसमर्थन करने की अपनी मंशा की घोषणा की: प्रोग्रामर के लिए बड़ी आधुनिक प्रोग्रामिंग भाषा; और छोटा संस्करण, बड़े संस्करण का उपसमुच्चय शिक्षकों और आकस्मिक कार्यान्वयनकर्ताओं द्वारा प्रशंसा की गई अतिसूक्ष्मवाद को निरंतर रखता है। स्कीम के इन दो नए संस्करणों पर काम करने के लिए दो कार्यकारी समूह बनाए गए थे। स्कीम सूची प्रोसेस साइट में कार्य समूहों के चार्टर्स, सार्वजनिक चर्चाओं और ट्रैकिंग प्रणाली जारी करने के लिंक हैं।

आर7आरएस (छोटी भाषा) का नौवां मसौदा 15 अप्रैल, 2013 को उपलब्ध कराया गया था। रेफरी नाम= आर7आरएस-ड्राफ्ट-9 > इस मसौदे की पुष्टि करने वाला मत 20 मई 2013 को समाप्त हुआ, और अंतिम रिपोर्ट 6 अगस्त 2013 से उपलब्ध है, उस प्रयास की 'छोटी' भाषा का वर्णन: इसलिए इसे अलगाव में R6RS के उत्तराधिकारी के रूप में नहीं माना जा सकता है।

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

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

यह खंड मुख्य रूप से भाषा की नवीन विशेषताओं पर ध्यान केंद्रित करता है, जिसमें उन विशेषताओं को शामिल किया गया है जो योजना को अन्य लिस्प्स से अलग करती हैं। जब तक अन्यथा न कहा जाए, सुविधाओं का विवरण R5RS मानक से संबंधित है। इस खंड में प्रदान किए गए उदाहरणों में, नोटेशन ===> परिणाम का उपयोग तुरंत पूर्ववर्ती पंक्ति पर अभिव्यक्ति के मूल्यांकन के परिणाम को इंगित करने के लिए किया जाता है। यह R5RS में प्रयुक्त समान कन्वेंशन है।

अतिसूक्ष्मवाद
योजना एक बहुत ही सरल भाषा है, तुलनीय अभिव्यंजक शक्ति (कंप्यूटर विज्ञान) की कई अन्य भाषाओं की तुलना में इसे लागू करना बहुत आसान है। स्कीम 48 कार्यान्वयन को इसलिए नाम दिया गया है क्योंकि दुभाषिया रिचर्ड केल्सी और जोनाथन रीस द्वारा 48 घंटे (6 अगस्त) में लिखा गया था। –7वां, 1986. देखें  यह आसानी लैम्ब्डा कैलकुस के उपयोग के कारण भाषा के वाक्य-विन्यास को अधिक आदिम रूपों से प्राप्त करने के लिए जिम्मेदार है। उदाहरण के लिए, R5RS योजना मानक में परिभाषित 23 s-एक्सप्रेशन-आधारित सिंटैक्टिक निर्माण, 14 को व्युत्पन्न या पुस्तकालय रूपों के रूप में वर्गीकृत किया गया है, जिन्हें मैक्रोज़ के रूप में लिखा जा सकता है जिसमें अधिक मौलिक रूप शामिल हैं, मुख्य रूप से लैम्ब्डा। जैसा कि R5RS (§3.1) कहता है: वेरिएबल बाइंडिंग कंस्ट्रक्शन का सबसे मौलिक लैम्ब्डा एक्सप्रेशन है, क्योंकि अन्य सभी वेरिएबल बाइंडिंग कंस्ट्रक्शन को लैम्ब्डा एक्सप्रेशन के संदर्भ में समझाया जा सकता है।


 * मौलिक रूप: परिभाषित करें, लैम्ब्डा, उद्धरण, अगर, परिभाषित-वाक्यविन्यास, लेट-सिंटेक्स, लेट्रेक-सिंटेक्स, सिंटैक्स-नियम, सेट!
 * व्युत्पन्न रूप: do, let, let*, letrec, cond, case, and, or, start,Named let,delay, unquote, unquote-splicing, quasiquote

उदाहरण: लागू करने के लिए एक मैक्रो  एक अभिव्यक्ति के रूप में   चर बाइंडिंग करने के लिए।

<वाक्यविन्यास लैंग = योजना> (परिभाषित-वाक्यविन्यास let (वाक्यविन्यास-नियम ((चलो ((var expr) ...) शरीर ...)     ((लैम्ब्डा (var ...) बॉडी ...) expr ...)))) 

इस प्रकार उपयोग करना  जैसा कि एक योजना कार्यान्वयन के ऊपर परिभाषित किया गया है, फिर से लिखा जाएगा जैसा, जो कार्यान्वयन के कार्य को कोडिंग प्रक्रिया के तात्कालिकता के कार्य तक कम कर देता है।

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

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

लेक्सिकल स्कूपिंग को शामिल करने की प्रेरणा, जो 1970 के दशक की शुरुआत में लिस्प के अपने नए संस्करण में एक असामान्य स्कूपिंग मॉडल था, ALGOL के सुस्मान के अध्ययन से आया था। उन्होंने सुझाव दिया कि ब्लॉक (प्रोग्रामिंग) | ALGOL- जैसे लेक्सिकल स्कोपिंग मैकेनिज्म, कार्ल हेविट#एक्टर मॉडल | हेविट के एक्टर मॉडल को लिस्प में लागू करने के अपने प्रारंभिक लक्ष्य को महसूस करने में मदद करेंगे।

लिस्प बोली में लेक्सिकल स्कोपिंग को कैसे पेश किया जाए, इस पर प्रमुख अंतर्दृष्टि को सुस्मान और स्टील के 1975 लैम्ब्डा पेपर, स्कीम: एन इंटरप्रेटर फॉर एक्सटेंडेड लैम्ब्डा कैलकुलस में लोकप्रिय बनाया गया था।

लैम्ब्डा कैलकुस
अलोंजो चर्च के गणितीय अंकन, लैम्ब्डा कैलकुस, ने लिस्प के लैम्ब्डा को प्रक्रिया प्रारंभ करने के लिए कीवर्ड के रूप में उपयोग करने के साथ-साथ लिस्प में उच्च-क्रम के कार्यों के उपयोग से जुड़े कार्यात्मक प्रोग्रामिंग विधियों के विकास को प्रभावित करने के लिए प्रेरित किया है। लेकिन प्रारंभिक लिस्प्स लैम्ब्डा कैलकुस के उपयुक्त मुक्त चर और बाध्य चर के उपचार के कारण अभिव्यक्ति नहीं थे।

औपचारिक लैम्ब्डा प्रणाली में स्वयंसिद्ध और पूर्ण गणना नियम होता है। यह गणितीय तर्क और उपकरणों का उपयोग करके विश्लेषण के लिए सहायक है। इस प्रणाली में, गणना को दिशात्मक कटौती के रूप में देखा जा सकता है। लैम्ब्डा कैलकुलस का वाक्य-विन्यास x, y, z, ..., कोष्ठक, रिक्त स्थान, अवधि और प्रतीक λ से पुनरावर्ती अभिव्यक्तियों का अनुसरण करता है। लैम्ब्डा गणना के कार्य में सम्मिलित हैं: सबसे पहले, शक्तिशाली गणितीय तर्क के प्रारंभिक बिंदु के रूप में कार्य करें। दूसरा, यह कार्यान्वयन विवरण पर विचार करने के लिए प्रोग्रामर की आवश्यकता को कम कर सकता है, क्योंकि इसका उपयोग मशीन मूल्यांकन की नकल करने के लिए किया जा सकता है। अंत में, लैम्ब्डा गणना ने पर्याप्त मेटा-सिद्धांत बनाया गया था।

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

ब्लॉक संरचना
योजना अपनी ब्लॉक संरचना को पहले की ब्लॉक संरचित भाषाओं, विशेष रूप से ALGOL से विरासत में लेती है। योजना में, ब्लॉक तीन बाध्यकारी संरचनाओं द्वारा कार्यान्वित किए जाते हैं: चलो अभिव्यक्ति |,  और. उदाहरण के लिए, निम्नलिखित निर्माण एक ब्लॉक (प्रोग्रामिंग) बनाता है जिसमें एक प्रतीक कहा जाता है  संख्या 10 के लिए बाध्य है:

<वाक्यविन्यास लैंग = योजना> (var हंस परिभाषित करें) (चलो ((वर 10)) ;; बयान यहाँ जाते हैं। यहां var का कोई भी संदर्भ 10 तक सीमित रहेगा।  ) 
 * यहाँ var का कोई भी संदर्भ हंस के लिए बाध्य होगा
 * यहाँ var का कोई भी संदर्भ हंस के लिए बाध्य होगा

प्रोग्रामर की आवश्यकता के अनुसार मनमाने ढंग से जटिल ब्लॉक संरचना बनाने के लिए ब्लॉक नेस्टिंग (कंप्यूटिंग) हो सकते हैं। स्थानीय बाइंडिंग बनाने के लिए ब्लॉक स्ट्रक्चरिंग का उपयोग नामकरण टकराव के जोखिम को कम करता है जो अन्यथा हो सकता है।

का एक रूप,  , बाइंडिंग को उसी निर्माण में पहले परिभाषित चरों को संदर्भित करने की अनुमति देता है, इस प्रकार:

<वाक्यविन्यास लैंग = योजना> (चलो * ((var1 10) (var2 (+ var1 12))) ;; लेकिन var1 की परिभाषा var2 को संदर्भित नहीं कर सकी  )

 अन्य संस्करण,, पारस्परिक पुनरावर्तन प्रक्रियाओं को एक दूसरे से बाध्य करने के लिए सक्षम करने के लिए डिज़ाइन किया गया है।

<वाक्यविन्यास लैंग = योजना>
 * जोड़े की सूची के रूप में हॉफस्टैटर के पुरुष और महिला अनुक्रमों की गणना

(परिभाषित करें (हॉफस्टाटर-नर-मादा एन) (लेट्रेक ((महिला (लैम्ब्डा (एन) (यदि (= n 0) 1 (- n (पुरुष (महिला (- n 1))))))) (पुरुष (लैम्ब्डा (एन) (यदि (= n 0) 0 (- n (महिला (पुरुष (- n 1)))))))   (पाश दें ((मैं0)) (अगर (> मैं n) ' (विपक्ष (विपक्ष (महिला मैं) (पुरुष मैं)) (लूप (+ i 1))))))

(हॉफस्टाटर-नर-मादा 8)

===> ((1 . 0) (1 . 0) (2 . 1) (2 . 2) (3 . 2) (3 . 3) (4 . 4) (5. 4) (5. 5) )  (इस उदाहरण में प्रयुक्त परिभाषाओं के लिए हॉफस्टाटर अनुक्रम# हॉफस्टाटर महिला और पुरुष अनुक्रम देखें। हॉफस्टैटर के नर और मादा अनुक्रम देखें।)

सभी प्रक्रियाएं एक में बंधी हुई हैं  नाम से एक दूसरे को संदर्भित कर सकते हैं, साथ ही पहले उसी में परिभाषित चर के मान भी , लेकिन वे उसी में बाद में परिभाषित मूल्यों को संदर्भित नहीं कर सकते हैं.

का एक रूप, नामित लेट फॉर्म, के बाद एक पहचानकर्ता है   कीवर्ड। यह लेट वेरिएबल्स को एक प्रक्रिया के तर्क से बांधता है जिसका नाम दिया गया पहचानकर्ता है और जिसका शरीर लेट फॉर्म का शरीर है। प्रक्रिया को कॉल करके वांछित के रूप में शरीर को दोहराया जा सकता है। पुनरावृत्ति को लागू करने के लिए नामित लेट का व्यापक रूप से उपयोग किया जाता है।

उदाहरण: एक साधारण काउंटर

<वाक्यविन्यास लैंग = योजना> (लेट लूप ((एन 1)) (अगर (> एन 10) '     (विपक्ष एन (लूप (+ n 1)))))

===> (1 2 3 4 5 6 7 8 9 10) 

योजना में किसी भी प्रक्रिया की तरह, नामित लेट में बनाई गई प्रक्रिया प्रथम श्रेणी की वस्तु है।

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

<वाक्यविन्यास लैंग = योजना>
 * 0 से 9 तक वर्गों की सूची बनाना:
 * नोट:लूप बस एक मनमाना प्रतीक है जिसका उपयोग लेबल के रूप में किया जाता है। कोई भी प्रतीक करेगा।

(परिभाषित करें (वर्गों की सूची n) (लूप दें ((i n) (res ')) (अगर (<मैं 0)       आर ई        (लूप (- i 1) (विपक्ष (* i) रेस)))))

(वर्गों की सूची 9) ===> (0 1 4 9 16 25 36 49 64 81) 

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

अनिवार्य प्रोग्रामिंग भाषाओं में वापसी कथन के व्यवहार का अनुकरण करने के लिए निरंतरता का उपयोग किया जा सकता है। निम्नलिखित समारोह, दिया गया कार्य   और सूची  , पहला तत्व लौटाता है   में   ऐसा है कि   सच हो जाता है।

<वाक्यविन्यास लैंग = योजना> (परिभाषित करें (ढूंढें-पहले func lst) (कॉल-साथ-वर्तमान-निरंतरता (लैम्ब्डा (वापसी-तत्काल)    (प्रत्येक के लिए (लैम्ब्डा (एक्स) (अगर (फंक एक्स) (वापसी-तुरंत x))) प्रथम)    #एफ)))

(पहला पूर्णांक खोजें? '(1/2 3/4 5.6 7 8/9 10 11)) ===> 7 (खोज-पहला शून्य? '(1 2 3 4)) ===> #एफ 

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

<वाक्यविन्यास लैंग = योजना> (चलो * ((यिन        ((लैम्ब्डा (सीसी) (प्रदर्शन @ ) सीसी) (कॉल-साथ-वर्तमान-निरंतरता (लैम्ब्डा (सी) सी)))       (यांग ((लैम्ब्डा (सीसी) (प्रदर्शन * ) सीसी) (कॉल-साथ-वर्तमान-निरंतरता (लैम्ब्डा (सी) सी))))) (यिन यांग))  निष्पादित होने पर यह कोड एक गिनती अनुक्रम प्रदर्शित करता है:

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

स्कीम में, डेटा को मैनिपुलेट और बाइंड करने के लिए उपयोग किए जाने वाले समान आदिम का उपयोग प्रक्रियाओं को बाइंड करने के लिए किया जा सकता है। सामान्य लिस्प  और   के आदिम  समकक्ष कोई नहीं है।

;; Variable bound to a number :

(define f 10)

f

===> 10

;; Mutation (altering the bound value)

(set! f (+ f f 6))

f

===> 26

;; Assigning a procedure to the same variable :

(set! f (lambda (n) (+ n 12)))

(f 6)

===> 18

;; Assigning the result of an expression to the same variable :

(set! f (f 1))

f

===> 13

;; functional programming :

(apply + '(1 2 3 4 5 6))

===> 21

(set! f (lambda (n) (+ n 100)))

(map f '(1 2 3))

===> (101 102 103)

कार्यान्वयन मानक
यह उपखंड उन डिजाइन निर्णयों का दस्तावेजीकरण करता है जो वर्षों से लिए गए हैं जिन्होंने स्कीम को विशेष चरित्र दिया है, लेकिन मूल डिजाइन के प्रत्यक्ष परिणाम नहीं हैं।

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

संख्याओं में स्पष्टता का गुण हो सकता है। स्पष्ट संख्या केवल स्पष्ट संचालन के अनुक्रम द्वारा उत्पादित की जा सकती है जिसमें अन्य स्पष्ट संख्याएं सम्मिलित हैं- इस प्रकार अक्षमता संक्रामक है। मानक निर्दिष्ट करता है कि किन्हीं भी दो कार्यान्वयनों को सभी परिचालनों के लिए समान परिणाम उत्पन्न करना चाहिए जिसके परिणामस्वरूप स्पष्ट संख्याएँ होती हैं।

आर5आरएस मानक प्रक्रियाओं को   और    निर्दिष्ट करता है, जिसका उपयोग किसी संख्या की स्पष्टता को बदलने के लिए किया जा सकता है।   स्पष्ट संख्या उत्पन्न करता है जो तर्क के संख्यात्मक रूप से निकटतम है।   अचूक संख्या उत्पन्न करता है जो संख्यात्मक रूप से तर्क के निकटतम है। आर6आरएस मानक इन प्रक्रियाओं को मुख्य सूची से हटा देता है, लेकिन उन्हें मानक पुस्तकालय (आरएनआरएस आर5आरएस (6)) में आर5आरएस संगतता प्रक्रियाओं के रूप में निर्दिष्ट करता है।

आर5आरएस मानक में, पूरे संख्यात्मक टॉवर को प्रयुक्त करने के लिए स्कीम कार्यान्वयन की आवश्यकता नहीं है, लेकिन उन्हें कार्यान्वयन के उद्देश्यों और स्कीम की भाषा (आर5आरएस सेकंड 6.2.3) की भावना दोनों के अनुरूप सुसंगत सबसेट प्रयुक्त करना होगा। नए आर6आरएस मानक को पूरे टॉवर के कार्यान्वयन की आवश्यकता होती है, और व्यावहारिक रूप से असीमित आकार और परिशुद्धता के स्पष्ट पूर्णांक ऑब्जेक्ट्स और स्पष्ट परिमेय संख्या ऑब्जेक्ट्स, और कुछ प्रक्रियाओं को प्रयुक्त करने के लिए ... इसलिए स्पष्ट तर्क दिए जाने पर वे सदैव स्पष्ट परिणाम देते हैं (आर6आरएस सेकंड। 3.4, धारा 11.7.1)।

उदाहरण 1: कार्यान्वयन में स्पष्ट अंकगणित जो स्पष्ट समर्थन करता है

;; Sum of three rational real numbers and two rational complex numbers

(define x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i))

x

===> 509/60+1/3i

;; Check for exactness.

(exact? x)

===> #t

उदाहरण 2: कार्यान्वयन में वही अंकगणित जो न तो स्पष्ट समर्थन करता है

;; Sum of four rational real numbers

(define xr (+ 1/3 1/4 -1/5 405/50))

;; Sum of two rational real numbers

(define xi (+ -1/3 2/3))

xr

===> 8.48333333333333

xi

===> 0.333333333333333

;; Check for exactness.

(exact? xr)

===> #f

(exact? xi)

===> #f

दोनों कार्यान्वयन आर5आरएस मानक के अनुरूप हैं लेकिन दूसरा आर6आरएस के अनुरूप नहीं है क्योंकि यह पूर्ण संख्यात्मक टावर को प्रयुक्त नहीं करता है।

विलंबित मूल्यांकन
स्कीम  प्रपत्र और प्रक्रिया   के माध्यम से विलंबित मूल्यांकन का समर्थन करती है।

(define a 10)

(define eval-aplus2 (delay (+ a 2)))

(set! a 20)

(force eval-aplus2)

===> 22

(define eval-aplus50 (delay (+ a 50)))

(let ((a 8))

(force eval-aplus50))

===> 70

(set! a 100)

(force eval-aplus2)

===> 22

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

ये आदिम, जो फ़्यूचर्स और वचनों के रूप में जाने वाले मूल्यों का उत्पादन या संचालन करते हैं, आदिम का उपयोग उन्नत आलसी मूल्यांकन निर्माणों जैसे स्ट्रीम (कंप्यूटिंग) को प्रयुक्त करने के लिए किया जा सकता है।

आर6आरएस मानक में, ये अब आदिम नहीं हैं, किन्तु इसके अतिरिक्त, आर5आरएस संगतता लाइब्रेरी (आरएनआरएस आर5आरएस (6)) के हिस्से के रूप में प्रदान किए जाते हैं।

आर5आरएस में, के कार्यान्वयन का सुझाव   और    दिया गया है, वचन को बिना किसी तर्क (थंक) के प्रक्रिया के रूप में प्रयुक्त करना और यह सुनिश्चित करने के लिए मेमोइजेशन का उपयोग करना कि यह केवल एक बार मूल्यांकन किया जाता है, चाहे कितनी भी बार   (आर5आरएस सेकंड 6.4) कहा जाता है ।

एसआरएफआई 41 असाधारण अर्थव्यवस्था के साथ परिमित और अनंत दोनों अनुक्रमों की अभिव्यक्ति को सक्षम बनाता है। उदाहरण के लिए, यह एसआरएफआई 41 में परिभाषित कार्यों का उपयोग करके फाइबोनैचि संख्या की परिभाषा है: ;; Define the Fibonacci sequence:

(define fibs  (stream-cons 0 (stream-cons 1      (stream-map + fibs (stream-cdr fibs))))) ;; Compute the hundredth number in the sequence: (stream-ref fibs 99) ===> 218922995834555169026

प्रक्रिया तर्कों के मूल्यांकन का क्रम
अधिकांश लिस्प्स प्रक्रिया तर्कों के मूल्यांकन के क्रम को निर्दिष्ट करते हैं। यह स्कीम नहीं है। मूल्यांकन का क्रम - जिसमें ऑपरेटर की स्थिति में अभिव्यक्ति का मूल्यांकन किया जाता है - कॉल-बाय-कॉल के आधार पर कार्यान्वयन द्वारा चुना जा सकता है, और एकमात्र बाधा यह है कि ऑपरेटर और ऑपरेंड के समवर्ती मूल्यांकन का प्रभाव अभिव्यक्ति मूल्यांकन के कुछ अनुक्रमिक क्रम के अनुरूप होने के लिए विवश है (आर5आरएस सेकंड 4.1.3) (let ((ev (lambda(n) (display "Evaluating ")

(display (if (procedure? n) "procedure" n)) (newline) n)))  ((ev +) (ev 1) (ev 2))) ===> 3

Evaluating 1 Evaluating 2 Evaluating procedure ईवी ऐसी प्रक्रिया है जो इसे दिए गए तर्क का वर्णन करती है, फिर तर्क का मान लौटाती है। अन्य लिस्प्स के विपरीत, स्कीम अभिव्यक्ति की ऑपरेटर स्थिति (पहली वस्तु) में अभिव्यक्ति की उपस्थिति अधिक नियमबद्ध है, जब तक कि ऑपरेटर की स्थिति में अभिव्यक्ति का परिणाम प्रक्रिया है।

1 और 2 को जोड़ने के लिए "+" प्रक्रिया को कॉल करने में, भाव (ev +), (ev 1) और (ev 2) का मूल्यांकन किसी भी क्रम में किया जा सकता है, जब तक कि प्रभाव ऐसा नहीं है जैसे कि उनका मूल्यांकन समानांतर में किया गया हो। इस प्रकार निम्नलिखित तीन पंक्तियों को किसी भी क्रम में मानक स्कीम द्वारा प्रदर्शित किया जा सकता है जब उपरोक्त उदाहरण कोड निष्पादित किया जाता है, चूंकि पंक्ति का पाठ दूसरे के साथ अंतःस्थापित नहीं किया जा सकता है क्योंकि यह अनुक्रमिक मूल्यांकन बाधा का उल्लंघन करेगा।

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

स्वच्छ मैक्रो प्रणाली के कार्यान्वयन को भी  कहा जाता है, शेष भाषा के शाब्दिक परिधि का सम्मान करना आवश्यक है। मैक्रो विस्तार के लिए विशेष नामकरण और स्कोपिंग नियमों द्वारा यह आश्वासन दिया गया है और सामान्य प्रोग्रामिंग त्रुटियों से बचा जाता है जो अन्य प्रोग्रामिंग भाषाओं के मैक्रो प्रणाली में हो सकती हैं। आर6आरएस अधिक परिष्कृत परिवर्तन प्रणाली   को निर्दिष्ट करता है, जो कुछ समय के लिए आर5आरएस स्कीम के भाषा विस्तार के रूप में उपलब्ध है। ;; Define a macro to implement a variant of "if" with a multi-expression ;; true branch and no false branch. (define-syntax when  (syntax-rules ((when pred exp exps ...)

(if pred (begin exp exps ...))))) मैक्रोज़ और प्रक्रियाओं के आह्वान में घनिष्ठ समानता होती है - दोनों एस-एक्सप्रेशन हैं - लेकिन उनका अलग तरह से व्यवहार किया जाता है। जब कंपाइलर प्रोग्राम में एस-एक्सप्रेशन का सामना करता है, तो यह पहले यह देखने के लिए जांच करता है कि प्रतीक को वर्तमान लेक्सिकल स्कोप के अंदर वाक्यात्मक कीवर्ड के रूप में परिभाषित किया गया है या नहीं। यदि ऐसा है, तो यह मैक्रो का विस्तार करने का प्रयास करता है, एस-एक्सप्रेशन की पूंछ में आइटमों का मूल्यांकन करने के लिए कोड को संकलित किए बिना तर्क के रूप में व्यवहार करता है, और यह प्रक्रिया पुनरावर्ती रूप से दोहराई जाती है जब तक कि कोई मैक्रो इनवोकेशन नहीं रहता। यदि यह वाक्यात्मक कीवर्ड नहीं है, तो कंपाइलर एस-एक्सप्रेशन की पूंछ में तर्कों का मूल्यांकन करने के लिए कोड संकलित करता है और फिर एस-एक्सप्रेशन के शीर्ष पर प्रतीक द्वारा दर्शाए गए चर का मूल्यांकन करता है और इसे प्रक्रिया के रूप में कॉल करता है मूल्यांकित टेल एक्सप्रेशंस इसे वास्तविक तर्क के रूप में पारित किया गया है।

अधिकांश स्कीम कार्यान्वयन अतिरिक्त मैक्रो प्रणाली भी प्रदान करते हैं। लोकप्रिय लोगों में वाक्यात्मक क्लोजर, स्पष्ट पुनर्नामकरण मैक्रोज़ और, गैर-स्वच्छ मैक्रो प्रणाली है जो सामान्य लिस्प में प्रदान की गई   प्रणाली के समान है।

मैक्रो स्वच्छ है या नहीं, यह निर्दिष्ट करने में असमर्थता मैक्रो प्रणाली की कमियों में से एक है। विस्तार के लिए वैकल्पिक मॉडल जैसे स्कोप सेट संभावित समाधान प्रदान करते हैं।

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

इस भ्रम का कारण यह है कि स्कीम में इसके शाब्दिक परिधि के साथ अभिव्यक्ति का मूल्यांकन करने का परिणाम इस बात पर निर्भर करता है कि इसका मूल्यांकन कहाँ किया जाता है। उदाहरण के लिए, यह स्पष्ट नहीं है कि निम्नलिखित अभिव्यक्ति का मूल्यांकन करने का परिणाम 5 या 6 होना चाहिए: (let ((name '+))

(let ((+ *))

(evaluate (list name 2 3)))) यदि बाहरी वातावरण में इसका मूल्यांकन किया जाता है, जहां  परिभाषित किया गया है, परिणाम ऑपरेंड का योग है। यदि इसका मूल्यांकन आंतरिक वातावरण में किया जाता है, जहां प्रतीक + को प्रक्रिया * के मान के लिए बाध्य किया गया है, परिणाम दो ऑपरेंड का उत्पाद है।

आर5आरएस वातावरण लौटाने वाली तीन प्रक्रियाओं को निर्दिष्ट करके और प्रक्रिया प्रदान करके इस भ्रम को हल करता है  जो एस-अभिव्यक्ति और वातावरण लेता है और प्रदान किए गए वातावरण में अभिव्यक्ति का मूल्यांकन करता है। (आर5आरएस सेकंड 6.5)  आर6आरएस नामक प्रक्रिया प्रदान करके इसे विस्तारित करता है   जिसके द्वारा प्रोग्रामर स्पष्ट रूप से निर्दिष्ट कर सकता है कि मूल्यांकन वातावरण में किन वस्तुओं को आयात करना है।

इस अभिव्यक्ति का मूल्यांकन करने के लिए आधुनिक स्कीम (सामान्यतः आर5आरएस के साथ संगत) के साथ, फलन को परिभाषित करने की आवश्यकता होती है  जो इस तरह दिख सकता है: (define (evaluate expr)

(eval expr (interaction-environment))) दुभाषिया का वैश्विक वातावरण है।

बूलियन अभिव्यक्तियों में गैर-बूलियन मूल्यों का उपचार
सामान्य लिस्प सहित लिस्प की अधिकांश बोलियों में, सम्मेलन द्वारा मूल्य  बूलियन व्यंजक में गलत मान का मूल्यांकन करता है। स्कीम में, 1991 में आईईईई मानक के बाद से, सभी    मूल्यों को छोड़कर, सम्मिलित स्कीम में   के समकक्ष सहित, जो इस   रूप में लिखा गया है, बूलियन व्यंजक में सही मान का मूल्यांकन करें। (आर5आरएस सेकंड 6.3.1)

जहां सत्य के बूलियन मान का प्रतिनिधित्व करने वाला स्थिरांक  है,  अधिकांश लिस्प्स में, स्कीम में   यह है।

आदिम डेटाटाइप्स की विसंगति
स्कीम में आदिम डेटाटाइप अलग हैं। निम्न में से केवल विधेय किसी भी स्कीम वस्तु के लिए सही हो सकता है:,  ,  ,  ,  ,  ,  ,  ,  । (आर5आरएस सेकंड 3.2)

संख्यात्मक डेटा प्रकार के अंदर, इसके विपरीत, संख्यात्मक मान ओवरलैप होते हैं। उदाहरण के लिए, पूर्णांक मान सभी को संतुष्ट करता है,  ,  ,   और   एक ही समय में भविष्यवाणी करता है। (आर5आरएस सेकंड 6.2)

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

स्कीम में प्रकार पर निर्भर तुल्यता संचालन भी उपस्थित हैं:  और   दो स्ट्रिंग्स की तुलना करें (उत्तरार्द्ध केस-स्वतंत्र तुलना करता है);   और   पात्रों की तुलना करें;   संख्याओं की तुलना करता है।

टिप्पणियाँ
आर5आरएस मानक तक, स्कीम में मानक टिप्पणी अर्धविराम थी, जो शेष रेखा को स्कीम के लिए अदृश्य बना देती है। कई कार्यान्वयनों ने वैकल्पिक सम्मेलनों का समर्थन किया है जो टिप्पणियों को पंक्ति से अधिक विस्तारित करने की अनुमति देते हैं, और आर6आरएस मानक उनमें से दो को अनुमति देता है: संपूर्ण एस-अभिव्यक्ति को टिप्पणी (या टिप्पणी की गई) में बदल दिया जा सकता है, इसके पहले (एसआरएफआई 62 में प्रस्तुत किया गया ) और बहुपंक्ति टिप्पणी   या ब्लॉक टिप्पणी   आसपास के पाठ द्वारा निर्मित की जा सकती है।

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

निम्नलिखित उदाहरण कठोर आर5आरएस स्कीम में लिखे गए हैं।

उदाहरण 1: आउटपुट डिफ़ॉल्ट (वर्तमान-आउटपुट-पोर्ट) के साथ:

(let ((hello0 (lambda (display "Hello world") (newline))))

(hello0))

उदाहरण 2: 1 के रूप में, लेकिन आउटपुट प्रक्रियाओं के लिए वैकल्पिक पोर्ट तर्क का उपयोग करना

(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))

(hello1 (current-output-port)))

उदाहरण 3: 1 के रूप में, लेकिन आउटपुट को नई बनाई गई फ़ाइल पर पुनर्निर्देशित किया जाता है

;; NB : with-output-to-file is an optional procedure in R5RS

(let ((hello0 (lambda (display "Hello world") (newline)))) (with-output-to-file "helloworldoutputfile" hello0)) उदाहरण 4:2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए स्पष्ट फ़ाइल खुली और बंदरगाह बंद है

(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))) (output-port (open-output-file "helloworldoutputfile")))

(hello1 output-port) (close-output-port output-port)) उदाहरण 5: 2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए कॉल-विद-आउटपुट-फाइल का उपयोग करने के साथ।

(let ((hello1 (lambda (p) (display "Hello world" p) (newline p)))) (call-with-output-file "helloworldoutputfile" hello1)) इनपुट के लिए समान प्रक्रियाएं प्रदान की जाती हैं। आर5आरएस स्कीम विधेय   और   प्रदान करती है। चरित्र इनपुट और आउटपुट के लिए, ,  ,   और   उपलब्ध कराए गए हैं। स्कीम के भाव लिखने और पढ़ने के लिए,   और   स्कीम प्रदान करती है। रीड ऑपरेशन पर, यदि इनपुट पोर्ट फ़ाइल के अंत तक पहुँच गया है, तो लौटाया गया परिणाम फ़ाइल का अंत है, और इसे विधेय   का उपयोग करके परीक्षण किया जा सकता है।

मानक के अतिरिक्त, एसआरएफआई 28 सामान्य लिस्प के समान मूलभूत स्वरूपण प्रक्रिया को परिभाषित करता है, जिसके बाद इसका नाम  कार्य दिया गया है।

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

(let ((original+ +))        (lambda args (apply (if (or (null? args) (string? (car args))) string-append original+)                 args)))) (+ 1 2 3) ===> 6 (+ "1" "2" "3") ===> "123" आर6आरएस (आर6आरएस सेकंड 7.1) में मानक सहित प्रत्येक बंधन, कुछ पुस्तकालय से संबंधित है, और सभी निर्यातित बंधन अपरिवर्तनीय हैं।  इस कारण से, उत्परिवर्तन द्वारा मानक प्रक्रियाओं को पुनर्परिभाषित करना प्रतिबंधित है। इसके अतिरिक्त, मानक प्रक्रिया के नाम से अलग प्रक्रिया आयात करना संभव है, जो वास्तव में पुनर्वितरण के समान है।

नामकरण और नामकरण परंपराएं
मानक स्कीम में, डेटाटाइप से दूसरे डेटाटाइप में परिवर्तित होने वाली प्रक्रियाओं में वर्ण स्ट्रिंग होती है -> उनके नाम पर, एक के साथ समाप्त होने की भविष्यवाणी करता है? , और प्रक्रियाएँ जो पहले से आवंटित डेटा के मान को बदल देती हैं, के साथ समाप्त हो जाती हैं! . इन सम्मेलनों का अधिकांशतः स्कीम प्रोग्रामर द्वारा पालन किया जाता है।

स्कीम मानकों जैसे औपचारिक संदर्भों में, लैम्ब्डा अभिव्यक्ति या आदिम प्रक्रिया को संदर्भित करने के लिए कार्य करने के लिए शब्द प्रक्रिया का उपयोग वरीयता में किया जाता है। सामान्य उपयोग में, शब्द प्रक्रिया और कार्य परस्पर विनिमय के लिए उपयोग किए जाते हैं। प्रक्रिया आवेदन को कभी-कभी औपचारिक रूप से संयोजन के रूप में संदर्भित किया जाता है।

अन्य लिस्प्स की तरह, थंक शब्द का उपयोग स्कीम में बिना किसी तर्क के प्रक्रिया को संदर्भित करने के लिए किया जाता है। प्रॉपर टेल रिकर्सन शब्द सभी स्कीम कार्यान्वयनों की संपत्ति को संदर्भित करता है, कि वे टेल-कॉल ऑप्टिमाइज़ेशन करते हैं जिससे सक्रिय टेल कॉल की अनिश्चित संख्या का समर्थन किया जा सके।

आर3आरएस, संशोधित के बाद से मानकों के दस्तावेजों के शीर्षक का रूप कलनविधि भाषा स्कीम पर सूची, एल्गोल मानक दस्तावेज़ के शीर्षक का संदर्भ है, कलनविधि भाषा एल्गोल 60 पर संशोधित सूची, आर3आरएस का सारांश पृष्ठ एल्गोल 60 सूची के सारांश पृष्ठ पर शुद्धता से तैयार किया गया है.

मानक रूपों और प्रक्रियाओं की समीक्षा
भाषा को औपचारिक रूप से मानकों आर5आरएस (1998) और आर6आरएस (2007) में परिभाषित किया गया है। वे मानक रूपों का वर्णन करते हैं: कीवर्ड और संबंधित वाक्य-विन्यास, जो भाषा की नियंत्रण संरचना प्रदान करते हैं, और मानक प्रक्रियाएं जो सामान्य कार्य करती हैं।

मानक रूप
यह तालिका स्कीम में मानक रूपों का वर्णन करती है। कुछ रूप एक से अधिक पंक्तियों में दिखाई देते हैं क्योंकि उन्हें सरलता से भाषा में एक ही कार्य में वर्गीकृत नहीं किया जा सकता है।

इस तालिका में एल चिह्नित रूपों को मानक में व्युत्पन्न पुस्तकालय रूपों के रूप में वर्गीकृत किया गया है और अधिकांशतः अभ्यास में अधिक मौलिक रूपों का उपयोग करके मैक्रोज़ के रूप में कार्यान्वित किया जाता है, जिससे कार्यान्वयन का कार्य अन्य भाषाओं की तुलना में अधिक सरल हो जाता है।

ध्यान दें कि  आर5आरएस में लाइब्रेरी वाक्य-विन्यास के रूप में परिभाषित किया गया है, लेकिन विस्तारक को स्प्लिसिंग कार्यक्षमता प्राप्त करने के लिए इसके बारे में जानना आवश्यक है। आर6आरएस में यह अब लाइब्रेरी वाक्य-विन्यास नहीं है।

मानक प्रक्रियाएं
निम्नलिखित दो तालिकाएँ आर5आरएस स्कीम में मानक प्रक्रियाओं का वर्णन करती हैं। आर6आरएस कहीं अधिक व्यापक है और इस प्रकार का सारांश व्यावहारिक नहीं होगा।

कुछ प्रक्रियाएँ एक से अधिक पंक्तियों में दिखाई देती हैं क्योंकि उन्हें सरलता से भाषा में एक ही कार्य में वर्गीकृत नहीं किया जा सकता है। स्ट्रिंग और चरित्र प्रक्रियाएं जिनके नाम में -सीआई सम्मिलित है, उनके तर्कों के बीच केस-स्वतंत्र तुलना करते हैं: एक ही वर्ण के अपर केस और लोअर केस संस्करणों को समान माना जाता है।

- और / के कार्यान्वयन जो दो से अधिक तर्क लेते हैं परिभाषित हैं लेकिन आर5आरएस पर वैकल्पिक छोड़ दिए गए हैं।

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

विभिन्न कार्यान्वयनों में अधिक व्यापक समर्थन वाले एसआरएफआई में सम्मिलित हैं:<ref name="srfi_support"></रेफरी>


 * 0: सुविधा-आधारित सशर्त विस्तार निर्माण
 * 1: सूची पुस्तकालय
 * 4: सजातीय संख्यात्मक वेक्टर डेटा प्रकार
 * 6: बेसिक स्ट्रिंग पोर्ट
 * 8: कई मूल्यों के लिए बाध्यकारी, प्राप्त करें
 * 9: रिकॉर्ड प्रकार परिभाषित करना
 * 13: स्ट्रिंग लाइब्रेरी
 * 14: कैरेक्टर-सेट लाइब्रेरी
 * 16: वेरिएबल एरिटी की प्रक्रियाओं के लिए सिंटैक्स
 * 17: सामान्यीकृत सेट!
 * 18: मल्टीथ्रेडिंग सपोर्ट
 * 19: समय डेटा प्रकार और प्रक्रियाएं
 * 25: बहुआयामी सरणी आदिम
 * 26: करी के बिना मापदंडों की विशेषज्ञता के लिए संकेतन
 * 27: यादृच्छिक बिट्स के स्रोत
 * 28: मूल प्रारूप तार
 * 29: अंतर्राष्ट्रीयकरण और स्थानीयकरण
 * 30: नेस्टेड मल्टी-लाइन टिप्पणियाँ
 * 31: पुनरावर्ती मूल्यांकन के लिए एक विशेष रूप
 * 37: आर्ग्स-फोल्ड: एक प्रोग्राम तर्क प्रोसेसर
 * 39: पैरामीटर ऑब्जेक्ट
 * 41: स्ट्रीम (कंप्यूटिंग) एस
 * 42: सूची की समझ
 * 43: वेक्टर लाइब्रेरी
 * 45: पुनरावृत्त आलसी एल्गोरिदम को व्यक्त करने के लिए आदिम
 * 60: बिट्स के रूप में पूर्णांक
 * 61: एक अधिक सामान्य शर्त खंड
 * 66: ऑक्टेट वैक्टर
 * 67: प्रक्रियाओं की तुलना करें

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

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

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

उपयोग
स्कीम का व्यापक रूप से संख्या द्वारा उपयोग किया जाता है, पिछले 12 वर्षों से, रैकेट (प्रोग्रामिंग भाषा) ने प्रोग्रामबायडिजाइन (पूर्व में शिक्षण स्कीम!) परिस्कीम चलाया है, जिसने लगभग 600 हाई स्कूल के शिक्षकों और हजारों हाई स्कूल के छात्रों को अल्पविकसित स्कीम प्रोग्रामिंग के लिए उजागर किया है। एमआईटी की पुरानी परिचयात्मक प्रोग्रामिंग कक्षा 6.001 को स्कीम में पढ़ाया गया था, रेफरी नाम = 6.001 > चूंकि 6.001 को और अधिक आधुनिक पाठ्यक्रमों से बदल दिया गया है, एसआईसीपी को एमआईटी में पढ़ाया जाना जारी है। गुलाब-हुलमैन अपने अधिक उन्नत प्रोग्रामिंग भाषा अवधारणा कोर्स में स्कीम का उपयोग करता है। ब्रैंडिस विश्वविद्यालय का कोर कोर्स, स्ट्रक्चर एंड इंटरप्रिटेशन ऑफ कंप्यूटर प्रोग्राम्स (सीओएसआई121बी), भी विशेष रूप से सैद्धांतिक कंप्यूटर वैज्ञानिक हैरी मैरसन द्वारा स्कीम में पढ़ाया जाता है। इंडियाना विश्वविद्यालय की परिचयात्मक कक्षा, सी211, पूरी तरह से स्कीम में पढ़ाई जाती है। पाठ्यक्रम का स्व-पुस्तक संस्करण, सीएस 61एएस, स्कीम का उपयोग करना जारी रखता है। येल और ग्रिनेल कॉलेज में परिचयात्मक कंप्यूटर विज्ञान पाठ्यक्रम भी स्कीम में पढ़ाए जाते हैं। जबकि कार्यात्मक प्रोग्रामिंग को तीसरे सेमेस्टर पाठ्यक्रम सीएससीआई 2041 में विस्तार से सम्मिलित किया गया है। संदर्भ नाम = umn3 >सीएससीआई 2041—नया पाठ्यक्रम सीएसई पाठ्यचर्या समिति, मिनेसोटा विश्वविद्यालय (2019 में देखा गया) -10-25) सॉफ्टवेयर उद्योग में, टाटा कंसल्टेंसी सर्विसेज, एशिया की सबसे बड़ी सॉफ्टवेयर कंसल्टेंसी फर्म, नए कॉलेज स्नातकों के लिए अपने महीने भर चलने वाले प्रशिक्षण कार्यक्रम में स्कीम का उपयोग करती है।

स्कीम का उपयोग निम्नलिखित के लिए भी किया गया था:

रेफरी नाम = एंड्रॉइड></रेफरी>
 * दस्तावेज़ शैली शब्दार्थ और विशिष्टता भाषा (डीएसएसएसएल), जो एसजीएमएल स्टाइल शीट (वेब ​​डेवलपमेंट) को निर्दिष्ट करने की विधि प्रदान करता है, स्कीम सबसेट का उपयोग करता है।
 * जाने-माने खुला स्रोत सॉफ्टवेयर रेखापुंज ग्राफिक्स संपादक जीआईएमपी स्क्रिप्टिंग भाषा के रूप में छोटी स्कीम का उपयोग करता है।
 * [ जीएनयू गुइल] को जीएनयू परिस्कीम द्वारा अपनी आधिकारिक स्क्रिप्टिंग भाषा के रूप में अपनाया गया है, और स्कीम का कार्यान्वयन एक्सटेंशन के लिए स्क्रिप्टिंग भाषा के रूप में जीएनयू लिलीपॉन्ड और जीएनयूकैश जैसे अनुप्रयोगों में अंतर्निहित है। इसी तरह, गाइल डेस्कटॉप वातावरण सूक्ति के लिए स्क्रिप्टिंग भाषा हुआ करती थी, और गनोम के ​​पास अभी भी परिस्कीम है जो इसके लाइब्रेरी स्टैक को गुइल बाइंडिंग प्रदान करता है।
 * फ़ाइनल फ़ैंटेसी: स्पिरिट्स विदिन फ़िल्म के वरिष्ठ प्रोग्रामर शिरो कवाई ने रीयल-टाइम रेंडरिंग इंजन के प्रबंधन के लिए स्क्रिप्टिंग भाषा के रूप में स्कीम का उपयोग किया। <ref name="शिरो_कवाई"> </रेफरी>
 * एंड्रॉइड (ऑपरेटिंग प्रणाली) के लिए गूगल ऐप आविष्कारक स्कीम का उपयोग करता है, जहां कावा (स्कीम कार्यान्वयन) का उपयोग एंड्रॉयड उपकरणों पर चलने वाली जावा वर्चुअल मशीन के लिए स्कीम कोड को बाइट-कोड में संकलित करने के लिए किया जाता है।

यह भी देखें

 * आधार के रूप में स्कीम का उपयोग प्रोग्रामिंग भाषाओं की अनिवार्यता, पाठ्यपुस्तक की अनिवार्यता

अग्रिम पठन

 * An Introduction to Scheme and its Implementation (a mirror)

बाहरी संबंध

 * schemers.org provides links to a number of Scheme resources including the specifications
 * Scheme Weekly
 * Bookmarklet that add Interactive Scheme REPL to any website
 * Scheme Weekly
 * Bookmarklet that add Interactive Scheme REPL to any website
 * Scheme Weekly
 * Bookmarklet that add Interactive Scheme REPL to any website