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

From Vigyanwiki
No edit summary
Line 100: Line 100:
=== लैम्ब्डा कैलकुस ===
=== लैम्ब्डा कैलकुस ===
{{See also|लैम्ब्डा कैलकुलस}}
{{See also|लैम्ब्डा कैलकुलस}}
[[अलोंजो चर्च]] के गणितीय अंकन, लैम्ब्डा कैलकुस, ने लिस्प के लैम्ब्डा को प्रक्रिया प्रारंभ करने के लिए कीवर्ड के रूप में उपयोग करने के साथ-साथ लिस्प में उच्च-क्रम के कार्यों के उपयोग से जुड़े कार्यात्मक प्रोग्रामिंग विधियों के विकास को प्रभावित करने के लिए प्रेरित किया है। लेकिन प्रारंभिक लिस्प्स लैम्ब्डा कैलकुस के उपयुक्त [[मुक्त चर और बाध्य चर]] के उपचार के कारण अभिव्यक्ति नहीं थे।<ref name="revisited" />
[[अलोंजो चर्च]] के गणितीय अंकन, लैम्ब्डा कैलकुस, ने लिस्प के लैम्ब्डा को प्रक्रिया प्रारंभ करने के लिए कीवर्ड के रूप में उपयोग करने के साथ-साथ लिस्प में उच्च-क्रम के कार्यों के उपयोग से जुड़े कार्यात्मक प्रोग्रामिंग विधियों के विकास को प्रभावित करने के लिए प्रेरित किया है। लेकिन प्रारंभिक लिप्स लैम्ब्डा कैलकुस के उपयुक्त [[मुक्त चर और बाध्य चर]] के उपचार के कारण अभिव्यक्ति नहीं थे।<ref name="revisited" />


औपचारिक लैम्ब्डा प्रणाली में स्वयंसिद्ध और पूर्ण गणना नियम होता है। यह गणितीय तर्क और उपकरणों का उपयोग करके विश्लेषण के लिए सहायक है। इस प्रणाली में, गणना को दिशात्मक कटौती के रूप में देखा जा सकता है। लैम्ब्डा कैलकुलस का वाक्य-विन्यास x, y, z, ..., कोष्ठक, रिक्त स्थान, अवधि और प्रतीक λ से पुनरावर्ती अभिव्यक्तियों का अनुसरण करता है।<ref>{{Cite journal |last=van Tonder |first=André |date=1 January 2004 |title=A Lambda Calculus for Quantum Computation |journal=SIAM Journal on Computing |volume=33 |issue=5 |pages=1109–1135 |arxiv=quant-ph/0307150 |doi=10.1137/S0097539703432165 |s2cid=613571}}</ref> लैम्ब्डा गणना के कार्य में सम्मिलित हैं: सबसे पहले, शक्तिशाली गणितीय तर्क के प्रारंभिक बिंदु के रूप में कार्य करें। दूसरा, यह कार्यान्वयन विवरण पर विचार करने के लिए प्रोग्रामर की आवश्यकता को कम कर सकता है, क्योंकि इसका उपयोग मशीन मूल्यांकन की नकल करने के लिए किया जा सकता है। अंत में, लैम्ब्डा गणना ने पर्याप्त मेटा-सिद्धांत बनाया गया था।<ref>{{Cite journal |last=Niehren |first=J. |last2=Schwinghammer |first2=J. |last3=Smolka |first3=G. |date=November 2006 |title=A concurrent lambda calculus with futures |url=https://hal.inria.fr/inria-00090434/file/0.pdf |journal=Theoretical Computer Science |volume=364 |issue=3 |pages=338–356 |doi=10.1016/j.tcs.2006.08.016}}</ref>
औपचारिक लैम्ब्डा प्रणाली में स्वयंसिद्ध और पूर्ण गणना नियम होता है। यह गणितीय तर्क और उपकरणों का उपयोग करके विश्लेषण के लिए सहायक है। इस प्रणाली में, गणना को दिशात्मक कटौती के रूप में देखा जा सकता है। लैम्ब्डा कैलकुलस का वाक्य-विन्यास x, y, z, ..., कोष्ठक, रिक्त स्थान, अवधि और प्रतीक λ से पुनरावर्ती अभिव्यक्तियों का अनुसरण करता है।<ref>{{Cite journal |last=van Tonder |first=André |date=1 January 2004 |title=A Lambda Calculus for Quantum Computation |journal=SIAM Journal on Computing |volume=33 |issue=5 |pages=1109–1135 |arxiv=quant-ph/0307150 |doi=10.1137/S0097539703432165 |s2cid=613571}}</ref> लैम्ब्डा गणना के कार्य में सम्मिलित हैं: सबसे पहले, शक्तिशाली गणितीय तर्क के प्रारंभिक बिंदु के रूप में कार्य करें। दूसरा, यह कार्यान्वयन विवरण पर विचार करने के लिए प्रोग्रामर की आवश्यकता को कम कर सकता है, क्योंकि इसका उपयोग मशीन मूल्यांकन की नकल करने के लिए किया जा सकता है। अंत में, लैम्ब्डा गणना ने पर्याप्त मेटा-सिद्धांत बनाया गया था।<ref>{{Cite journal |last=Niehren |first=J. |last2=Schwinghammer |first2=J. |last3=Smolka |first3=G. |date=November 2006 |title=A concurrent lambda calculus with futures |url=https://hal.inria.fr/inria-00090434/file/0.pdf |journal=Theoretical Computer Science |volume=364 |issue=3 |pages=338–356 |doi=10.1016/j.tcs.2006.08.016}}</ref>


लेक्सिकल स्कोप की प्रारंभ ने लैम्ब्डा संकेतन के कुछ रूपों और कार्यशील प्रोग्रामिंग भाषा में उनकी व्यावहारिक अभिव्यक्ति के बीच समानता बनाकर समस्या का समाधान किया। सुस्मान और स्टील ने दिखाया कि नई भाषा का उपयोग एल्गोल और [[फोरट्रान]] सहित अन्य प्रोग्रामिंग भाषाओं के सभी अनिवार्य और घोषणात्मक शब्दार्थों को सुरुचिपूर्ण ढंग से प्राप्त करने के लिए किया जा सकता है, और लैम्ब्डा अभिव्यक्तियों का उपयोग करके अन्य लिस्प्स के गतिशील परिधि को सरल प्रक्रिया तात्कालिकता के रूप में नहीं किन्तु नियंत्रण संरचनाओं और पर्यावरण संशोधक के रूप में उपयोग किया जा सकता है।<ref name="lambda_paper_2">{{Cite journal |last=Gerald Jay Sussman |last2=Guy Lewis Steele Jr. |name-list-style=amp |date=March 1976 |title=लैम्ब्डा: द अल्टीमेट इंपीरेटिव|url=http://library.readscheme.org/page1.html |url-status=dead |format=postscript or PDF |journal=AI Memos |publisher=[[MIT Computer Science and Artificial Intelligence Laboratory|MIT AI Lab]] |volume=AIM-353 |archive-url=https://web.archive.org/web/20160510140804/http://library.readscheme.org/page1.html |archive-date=2016-05-10 |access-date=2012-08-09}}</रेफरी> उन्होंने लैम्ब्डा पेपर्स के पहले में योजना के अपने पहले विवरण के साथ निरंतरता-पासिंग शैली की शुरुआत की, और बाद के पेपरों में, वे लैम्ब्डा कैलकुस के इस व्यावहारिक उपयोग की कच्ची शक्ति का प्रदर्शन करने के लिए आगे बढ़े।
लेक्सिकल स्कोप की प्रारंभ ने लैम्ब्डा संकेतन के कुछ रूपों और कार्यशील प्रोग्रामिंग भाषा में उनकी व्यावहारिक अभिव्यक्ति के बीच समानता बनाकर समस्या का समाधान किया। सुस्मान और स्टील ने दिखाया कि नई भाषा का उपयोग एल्गोल और [[फोरट्रान]] सहित अन्य प्रोग्रामिंग भाषाओं के सभी अनिवार्य और घोषणात्मक शब्दार्थों को सुरुचिपूर्ण ढंग से प्राप्त करने के लिए किया जा सकता है, और लैम्ब्डा अभिव्यक्तियों का उपयोग करके अन्य लिप्स के गतिशील परिधि को सरल प्रक्रिया तात्कालिकता के रूप में नहीं किन्तु नियंत्रण संरचनाओं और पर्यावरण संशोधक के रूप में उपयोग किया जा सकता है।<ref name="lambda_paper_2">{{Cite journal |last=Gerald Jay Sussman |last2=Guy Lewis Steele Jr. |name-list-style=amp |date=March 1976 |title=लैम्ब्डा: द अल्टीमेट इंपीरेटिव|url=http://library.readscheme.org/page1.html |url-status=dead |format=postscript or PDF |journal=AI Memos |publisher=[[MIT Computer Science and Artificial Intelligence Laboratory|MIT AI Lab]] |volume=AIM-353 |archive-url=https://web.archive.org/web/20160510140804/http://library.readscheme.org/page1.html |archive-date=2016-05-10 |access-date=2012-08-09}}</रेफरी> उन्होंने लैम्ब्डा पेपर्स के पहले में योजना के अपने पहले विवरण के साथ निरंतरता-पासिंग शैली की शुरुआत की, और बाद के पेपरों में, वे लैम्ब्डा कैलकुस के इस व्यावहारिक उपयोग की कच्ची शक्ति का प्रदर्शन करने के लिए आगे बढ़े।


===ब्लॉक संरचना===
===ब्लॉक संरचना===
Line 231: Line 231:
कॉमन लिस्प के विपरीत, योजना में सभी डेटा और प्रक्रियाएं एक सामान्य नाम स्थान साझा करती हैं, जबकि कॉमन लिस्प में कॉमन लिस्प#फ़ंक्शन नेमस्पेस एक फ़ंक्शन और एक चर के लिए एक ही नाम को संभव बनाता है, और एक को संदर्भित करने के लिए विशेष संकेतन की आवश्यकता होती है। मूल्य के रूप में कार्य करें। इसे कभी-कभी लिस्प-1 बनाम लिस्प-2 भेद के रूप में जाना जाता है, जो योजना के एकीकृत नामस्थान और कॉमन लिस्प के अलग-अलग नामस्थानों का संदर्भ देता है।<nowiki><ref></nowiki>{{Cite news |last=Gabriel |first=Richard P. |author-link=Richard P. Gabriel |last2=Pitman |first2=Kent |author-link2=Kent Pitman |year=1988 |title=Technical Issues of Separation in Function Cells and Value Cells |volume=1 |pages=81–101 |work=Lisp and Symbolic Computation |issue=1 |publication-date=June 1988 |url=http://www.nhplace.com/kent/Papers/Technical-Issues.html |access-date=2012-08-09 |doi=10.1007/BF01806178}}</ref>
कॉमन लिस्प के विपरीत, योजना में सभी डेटा और प्रक्रियाएं एक सामान्य नाम स्थान साझा करती हैं, जबकि कॉमन लिस्प में कॉमन लिस्प#फ़ंक्शन नेमस्पेस एक फ़ंक्शन और एक चर के लिए एक ही नाम को संभव बनाता है, और एक को संदर्भित करने के लिए विशेष संकेतन की आवश्यकता होती है। मूल्य के रूप में कार्य करें। इसे कभी-कभी लिस्प-1 बनाम लिस्प-2 भेद के रूप में जाना जाता है, जो योजना के एकीकृत नामस्थान और कॉमन लिस्प के अलग-अलग नामस्थानों का संदर्भ देता है।<nowiki><ref></nowiki>{{Cite news |last=Gabriel |first=Richard P. |author-link=Richard P. Gabriel |last2=Pitman |first2=Kent |author-link2=Kent Pitman |year=1988 |title=Technical Issues of Separation in Function Cells and Value Cells |volume=1 |pages=81–101 |work=Lisp and Symbolic Computation |issue=1 |publication-date=June 1988 |url=http://www.nhplace.com/kent/Papers/Technical-Issues.html |access-date=2012-08-09 |doi=10.1007/BF01806178}}</ref>


योजना में, डेटा को मैनिपुलेट और बाइंड करने के लिए उपयोग किए जाने वाले समान आदिम का उपयोग प्रक्रियाओं को बाइंड करने के लिए किया जा सकता है। सामान्य लिस्प <code>defun</code> और <code>#'</code> के आदिम  समकक्ष कोई नहीं है।
योजना में, डेटा को मैनिपुलेट और बाइंड करने के लिए उपयोग किए जाने वाले समान आदिम का उपयोग प्रक्रियाओं को बाइंड करने के लिए किया जा सकता है। सामान्य लिस्प <code>defun</code> और <code>#'</code> के आदिम  समकक्ष कोई नहीं है।<syntaxhighlight>
;; 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)
</syntaxhighlight>'''<nowiki>;;</nowiki> Variable bound to a number<nowiki>:</nowiki>'''


<nowiki>;;</nowiki> Variable bound to a number<nowiki>:</nowiki>
'''(define f 10)'''


(define f 10)
'''f'''


f
'''===> 10'''


===> 10
'''<nowiki>;;</nowiki> Mutation (altering the bound value)'''


<nowiki>;;</nowiki> Mutation (altering the bound value)
'''(set! f (+ f f 6))'''


(set! f (+ f f 6))
'''f'''
 
f


===> 26
'''===> 26'''


<nowiki>;;</nowiki> Assigning a procedure to the same variable<nowiki>:</nowiki>
'''<nowiki>;;</nowiki> Assigning a procedure to the same variable<nowiki>:</nowiki>'''


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


(f 6)
'''(f 6)'''


===> 18
'''===> 18'''


<nowiki>;;</nowiki> Assigning the result of an expression to the same variable<nowiki>:</nowiki>
'''<nowiki>;;</nowiki> Assigning the result of an expression to the same variable<nowiki>:</nowiki>'''


(set! f (f 1))
'''(set! f (f 1))'''


f
'''f'''


===> 13
'''===> 13'''


<nowiki>;;</nowiki> functional programming<nowiki>:</nowiki>
'''<nowiki>;;</nowiki> functional programming<nowiki>:</nowiki>'''


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


===> 21
'''===> 21'''


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


(map f '(1 2 3))
'''(map f '(1 2 3))'''


===> (101 102 103)
'''===> (101 102 103)'''
;;
;;


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


उदाहरण 1: कार्यान्वयन में स्पष्ट अंकगणित जो स्पष्ट समर्थन करता है
उदाहरण 1: कार्यान्वयन में स्पष्ट अंकगणित जो स्पष्ट समर्थन करता है<syntaxhighlight>
 
;; Sum of three rational real numbers and two rational complex numbers
<nowiki>;;</nowiki> 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))
(define x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i))
x
x
===> 509/60+1/3i
===> 509/60+1/3i
;; Check for exactness.
(exact? x)
===> #t
</syntaxhighlight>'''<nowiki>;;</nowiki> Sum of three rational real numbers and two rational complex numbers'''


<nowiki>;;</nowiki> Check for exactness.
'''(define x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i))'''


(exact? x)
'''x'''


===> #t
'''===> 509/60+1/3i'''


'''<nowiki>;;</nowiki> Check for exactness.'''


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


<nowiki>;;</nowiki> Sum of four rational real numbers
'''===> #t'''


उदाहरण 2: कार्यान्वयन में वही अंकगणित जो न तो स्पष्ट समर्थन करता है<syntaxhighlight>
;; Sum of four rational real numbers
(define xr (+ 1/3 1/4 -1/5 405/50))
(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
</syntaxhighlight>'''<nowiki>;;</nowiki> Sum of four rational real numbers'''
'''(define xr (+ 1/3 1/4 -1/5 405/50))'''


<nowiki>;;</nowiki> Sum of two rational real numbers
'''<nowiki>;;</nowiki> Sum of two rational real numbers'''


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


xr
'''xr'''


===> 8.48333333333333
'''===> 8.48333333333333'''


xi
'''xi'''


===> 0.333333333333333
'''===> 0.333333333333333'''


<nowiki>;;</nowiki> Check for exactness.
'''<nowiki>;;</nowiki> Check for exactness.'''


(exact? xr)
'''(exact? xr)'''


===> #f
'''===> #f'''


(exact? xi)
'''(exact? xi)'''


===> #f
'''===> #f'''


दोनों कार्यान्वयन आर5आरएस मानक के अनुरूप हैं लेकिन दूसरा आर6आरएस के अनुरूप नहीं है क्योंकि यह पूर्ण संख्यात्मक टावर को प्रयुक्त नहीं करता है।
दोनों कार्यान्वयन आर5आरएस मानक के अनुरूप हैं लेकिन दूसरा आर6आरएस के अनुरूप नहीं है क्योंकि यह पूर्ण संख्यात्मक टावर को प्रयुक्त नहीं करता है।
=== विलंबित मूल्यांकन ===
=== विलंबित मूल्यांकन ===
{{See also|सुस्त मूल्यांकन}}
{{See also|सुस्त मूल्यांकन}}
योजना <code>delay</code> प्रपत्र और प्रक्रिया <code>force</code> के माध्यम से विलंबित मूल्यांकन का समर्थन करती है।
योजना <code>delay</code> प्रपत्र और प्रक्रिया <code>force</code> के माध्यम से विलंबित मूल्यांकन का समर्थन करती है।<syntaxhighlight>
 
(define a 10)
(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
</syntaxhighlight>'''(define a 10)'''


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


(set! a 20)
'''(set! a 20)'''


(force eval-aplus2)
'''(force eval-aplus2)'''


===> 22
'''===> 22'''


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


(let ((a 8))
'''(let ((a 8))'''


(force eval-aplus50))
'''(force eval-aplus50))'''


===> 70
'''===> 70'''


(set! a 100)
'''(set! a 100)'''


(force eval-aplus2)
'''(force eval-aplus2)'''


===> 22
'''===> 22'''


वचन की मूल परिभाषा का शाब्दिक संदर्भ संरक्षित है, और <code>force</code> के पहले प्रयोग के बाद इसका मूल्य भी संरक्षित है। वचन केवल एक बार मूल्यांकन किया जाता है।
वचन की मूल परिभाषा का शाब्दिक संदर्भ संरक्षित है, और <code>force</code> के पहले प्रयोग के बाद इसका मूल्य भी संरक्षित है। वचन केवल एक बार मूल्यांकन किया जाता है।
Line 373: Line 422:
आर5आरएस में, के कार्यान्वयन का सुझाव  <code>delay</code> और <code>force</code>  दिया गया है, वचन को बिना किसी तर्क ([[थंक]]) के प्रक्रिया के रूप में प्रयुक्त करना और यह सुनिश्चित करने के लिए [[memoization|मेमोइजेशन]] का उपयोग करना कि यह केवल एक बार मूल्यांकन किया जाता है, चाहे कितनी भी बार <code>force</code> (आर5आरएस सेकंड 6.4) कहा जाता है ।<ref name="r5rs" />
आर5आरएस में, के कार्यान्वयन का सुझाव  <code>delay</code> और <code>force</code>  दिया गया है, वचन को बिना किसी तर्क ([[थंक]]) के प्रक्रिया के रूप में प्रयुक्त करना और यह सुनिश्चित करने के लिए [[memoization|मेमोइजेशन]] का उपयोग करना कि यह केवल एक बार मूल्यांकन किया जाता है, चाहे कितनी भी बार <code>force</code> (आर5आरएस सेकंड 6.4) कहा जाता है ।<ref name="r5rs" />


एसआरएफआई 41 असाधारण अर्थव्यवस्था के साथ परिमित और अनंत दोनों अनुक्रमों की अभिव्यक्ति को सक्षम बनाता है। उदाहरण के लिए, यह एसआरएफआई 41 में परिभाषित कार्यों का उपयोग करके [[फाइबोनैचि संख्या]] की परिभाषा है:<ref name="srfi-41" />
एसआरएफआई 41 असाधारण अर्थव्यवस्था के साथ परिमित और अनंत दोनों अनुक्रमों की अभिव्यक्ति को सक्षम बनाता है। उदाहरण के लिए, यह एसआरएफआई 41 में परिभाषित कार्यों का उपयोग करके [[फाइबोनैचि संख्या]] की परिभाषा है:<ref name="srfi-41" /><syntaxhighlight>
  ;; Define the Fibonacci sequence:
;; Define the Fibonacci sequence:
 
(define fibs
(define fibs
  (stream-cons 0
  (stream-cons 0
    (stream-cons 1
    (stream-cons 1
      (stream-map +
      (stream-map +
        fibs
        fibs
        (stream-cdr fibs)))))
        (stream-cdr fibs)))))
;; Compute the hundredth number in the sequence:
;; Compute the hundredth number in the sequence:
(stream-ref fibs 99)
(stream-ref fibs 99)
===>  218922995834555169026
===>  218922995834555169026
</syntaxhighlight>
=== प्रक्रिया तर्कों के मूल्यांकन का क्रम ===
=== प्रक्रिया तर्कों के मूल्यांकन का क्रम ===
अधिकांश लिस्प्स प्रक्रिया तर्कों के मूल्यांकन के क्रम को निर्दिष्ट करते हैं। यह योजना नहीं है। मूल्यांकन का क्रम - जिसमें ऑपरेटर की स्थिति में अभिव्यक्ति का मूल्यांकन किया जाता है - कॉल-बाय-कॉल के आधार पर कार्यान्वयन द्वारा चुना जा सकता है, और एकमात्र बाधा यह है कि ऑपरेटर और ऑपरेंड के समवर्ती मूल्यांकन का प्रभाव अभिव्यक्ति मूल्यांकन के कुछ अनुक्रमिक क्रम के अनुरूप होने के लिए विवश है (आर5आरएस सेकंड 4.1.3)<ref name="r5rs"/>
अधिकांश लिप्स प्रक्रिया तर्कों के मूल्यांकन के क्रम को निर्दिष्ट करते हैं। यह योजना नहीं है। मूल्यांकन का क्रम - जिसमें ऑपरेटर की स्थिति में अभिव्यक्ति का मूल्यांकन किया जाता है - कॉल-बाय-कॉल के आधार पर कार्यान्वयन द्वारा चुना जा सकता है, और एकमात्र बाधा यह है कि ऑपरेटर और ऑपरेंड के समवर्ती मूल्यांकन का प्रभाव अभिव्यक्ति मूल्यांकन के कुछ अनुक्रमिक क्रम के अनुरूप होने के लिए विवश है (आर5आरएस सेकंड 4.1.3)<ref name="r5rs"/><syntaxhighlight>
                 (let ((ev (lambda(n) (display "Evaluating ")
(let ((ev (lambda(n) (display "Evaluating ")
                    (display (if (procedure? n) "procedure" n))
                    (newline) n)))
  ((ev +) (ev 1) (ev 2)))
===> 3
</syntaxhighlight>
                 '''(let ((ev (lambda(n) (display "Evaluating ")'''


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


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


1 और 2 को जोड़ने के लिए "{{mono|+}}" प्रक्रिया को कॉल करने में, भाव {{mono|(ev +), (ev 1)}} और {{mono|(ev 2)}} का मूल्यांकन किसी भी क्रम में किया जा सकता है, जब तक कि प्रभाव ऐसा नहीं है जैसे कि उनका मूल्यांकन समानांतर में किया गया हो। इस प्रकार निम्नलिखित तीन पंक्तियों को किसी भी क्रम में मानक योजना द्वारा प्रदर्शित किया जा सकता है जब उपरोक्त उदाहरण कोड निष्पादित किया जाता है, चूंकि पंक्ति का पाठ दूसरे के साथ अंतःस्थापित नहीं किया जा सकता है क्योंकि यह अनुक्रमिक मूल्यांकन बाधा का उल्लंघन करेगा।
1 और 2 को जोड़ने के लिए "{{mono|+}}" प्रक्रिया को कॉल करने में, भाव {{mono|(ev +), (ev 1)}} और {{mono|(ev 2)}} का मूल्यांकन किसी भी क्रम में किया जा सकता है, जब तक कि प्रभाव ऐसा नहीं है जैसे कि उनका मूल्यांकन समानांतर में किया गया हो। इस प्रकार निम्नलिखित तीन पंक्तियों को किसी भी क्रम में मानक योजना द्वारा प्रदर्शित किया जा सकता है जब उपरोक्त उदाहरण कोड निष्पादित किया जाता है, चूंकि पंक्ति का पाठ दूसरे के साथ अंतःस्थापित नहीं किया जा सकता है क्योंकि यह अनुक्रमिक मूल्यांकन बाधा का उल्लंघन करेगा।
Line 406: Line 462:
आर5आरएस मानक में और बाद की सूची में भी, योजना के वाक्य-विन्यास को मैक्रो प्रणाली के माध्यम से सरलता से बढ़ाया जा सकता है। आर5आरएस मानक ने शक्तिशाली स्वच्छ मैक्रो प्रणाली प्रस्तुत किया जो प्रोग्रामर को सरल [[पैटर्न मिलान]] उपभाषा (आर5आरएस सेकंड 4.3) का उपयोग करके भाषा में नए वाक्यात्मक निर्माण जोड़ने की अनुमति देता है।<ref name="r5rs"/>  इससे पहले, स्वच्छ मैक्रो प्रणाली को आर4आरएस मानक के परिशिष्ट के रूप में निम्न स्तर मैक्रो प्रणाली के साथ उच्च स्तरीय प्रणाली के रूप में हटा दिया गया था, दोनों को भाषा के अनिवार्य भाग के अतिरिक्त योजना के विस्तार के रूप में माना जाता था।<ref name="r4rs">{{Cite journal |year=1991 |title=Revised<sup>4</sup> Report on the Algorithmic Language Scheme |url=http://www.cs.indiana.edu/scheme-repository/R4RS/r4rs_toc.html |journal=ACM Lisp Pointers |volume=4 |issue=3 |pages=1–55 |access-date=2012-08-09 |editor=William Clinger and Jonathan Rees}}</ref>
आर5आरएस मानक में और बाद की सूची में भी, योजना के वाक्य-विन्यास को मैक्रो प्रणाली के माध्यम से सरलता से बढ़ाया जा सकता है। आर5आरएस मानक ने शक्तिशाली स्वच्छ मैक्रो प्रणाली प्रस्तुत किया जो प्रोग्रामर को सरल [[पैटर्न मिलान]] उपभाषा (आर5आरएस सेकंड 4.3) का उपयोग करके भाषा में नए वाक्यात्मक निर्माण जोड़ने की अनुमति देता है।<ref name="r5rs"/>  इससे पहले, स्वच्छ मैक्रो प्रणाली को आर4आरएस मानक के परिशिष्ट के रूप में निम्न स्तर मैक्रो प्रणाली के साथ उच्च स्तरीय प्रणाली के रूप में हटा दिया गया था, दोनों को भाषा के अनिवार्य भाग के अतिरिक्त योजना के विस्तार के रूप में माना जाता था।<ref name="r4rs">{{Cite journal |year=1991 |title=Revised<sup>4</sup> Report on the Algorithmic Language Scheme |url=http://www.cs.indiana.edu/scheme-repository/R4RS/r4rs_toc.html |journal=ACM Lisp Pointers |volume=4 |issue=3 |pages=1–55 |access-date=2012-08-09 |editor=William Clinger and Jonathan Rees}}</ref>


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


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


Line 422: Line 485:


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


इस भ्रम का कारण यह है कि योजना में इसके शाब्दिक परिधि के साथ अभिव्यक्ति का मूल्यांकन करने का परिणाम इस बात पर निर्भर करता है कि इसका मूल्यांकन कहाँ किया जाता है। उदाहरण के लिए, यह स्पष्ट नहीं है कि निम्नलिखित अभिव्यक्ति का मूल्यांकन करने का परिणाम 5 या 6 होना चाहिए:<ref name="rees_1992">जोनाथन रीस, [http://mumble.net/~jar/pubs/scheme-of-things/june-92-meeting.ps द स्कीम ऑफ़ थिंग्स द जून 1992 मीटिंग] {{Webarchive|url=https://web.archive.org/web/20110716071317/http://mumble.net/~jar/pubs/scheme-of-things/june-92-meeting.ps# |date=2011-07-16 }} (पोस्टस्क्रिप्ट), लिस्प पॉइंटर्स में, वी (4), अक्टूबर-दिसंबर 1992।
इस भ्रम का कारण यह है कि योजना में इसके शाब्दिक परिधि के साथ अभिव्यक्ति का मूल्यांकन करने का परिणाम इस बात पर निर्भर करता है कि इसका मूल्यांकन कहाँ किया जाता है। उदाहरण के लिए, यह स्पष्ट नहीं है कि निम्नलिखित अभिव्यक्ति का मूल्यांकन करने का परिणाम 5 या 6 होना चाहिए:<ref name="rees_1992">जोनाथन रीस, [http://mumble.net/~jar/pubs/scheme-of-things/june-92-meeting.ps द स्कीम ऑफ़ थिंग्स द जून 1992 मीटिंग] {{Webarchive|url=https://web.archive.org/web/20110716071317/http://mumble.net/~jar/pubs/scheme-of-things/june-92-meeting.ps# |date=2011-07-16 }} (पोस्टस्क्रिप्ट), लिस्प पॉइंटर्स में, वी (4), अक्टूबर-दिसंबर 1992।
पुनःप्राप्त 2012-08-09</ref>
पुनःप्राप्त 2012-08-09</ref><syntaxhighlight>
  (let ((name '+))
(let ((name '+))
  (let ((+ *))
    (evaluate (list name 2 3))))
</syntaxhighlight>
  '''(let ((name '+))'''


  (let ((+ *))
  '''(let ((+ *))'''


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


आर5आरएस वातावरण लौटाने वाली तीन प्रक्रियाओं को निर्दिष्ट करके और प्रक्रिया प्रदान करके इस भ्रम को हल करता है <code>eval</code> जो एस-अभिव्यक्ति और वातावरण लेता है और प्रदान किए गए वातावरण में अभिव्यक्ति का मूल्यांकन करता है। (आर5आरएस सेकंड 6.5)<ref name="r5rs" />  आर6आरएस नामक प्रक्रिया प्रदान करके इसे विस्तारित करता है <code>environment</code> जिसके द्वारा प्रोग्रामर स्पष्ट रूप से निर्दिष्ट कर सकता है कि मूल्यांकन वातावरण में किन वस्तुओं को आयात करना है।
आर5आरएस वातावरण लौटाने वाली तीन प्रक्रियाओं को निर्दिष्ट करके और प्रक्रिया प्रदान करके इस भ्रम को हल करता है <code>eval</code> जो एस-अभिव्यक्ति और वातावरण लेता है और प्रदान किए गए वातावरण में अभिव्यक्ति का मूल्यांकन करता है। (आर5आरएस सेकंड 6.5)<ref name="r5rs" />  आर6आरएस नामक प्रक्रिया प्रदान करके इसे विस्तारित करता है <code>environment</code> जिसके द्वारा प्रोग्रामर स्पष्ट रूप से निर्दिष्ट कर सकता है कि मूल्यांकन वातावरण में किन वस्तुओं को आयात करना है।


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


=== बूलियन अभिव्यक्तियों में गैर-बूलियन मूल्यों का उपचार ===
=== बूलियन अभिव्यक्तियों में गैर-बूलियन मूल्यों का उपचार ===
सामान्य लिस्प सहित लिस्प की अधिकांश बोलियों में, सम्मेलन द्वारा मूल्य <code>NIL</code> बूलियन व्यंजक में गलत मान का मूल्यांकन करता है। योजना में, 1991 में आईईईई मानक के बाद से,<ref name="ieee1178" /> सभी  <code>#f</code> मूल्यों को छोड़कर, सम्मिलित योजना में <code>NIL</code> के समकक्ष सहित, जो इस <code>'()</code> रूप में लिखा गया है, बूलियन व्यंजक में सही मान का मूल्यांकन करें। (आर5आरएस सेकंड 6.3.1)<ref name="r5rs" />
सामान्य लिस्प सहित लिस्प की अधिकांश बोलियों में, सम्मेलन द्वारा मूल्य <code>NIL</code> बूलियन व्यंजक में गलत मान का मूल्यांकन करता है। योजना में, 1991 में आईईईई मानक के बाद से,<ref name="ieee1178" /> सभी  <code>#f</code> मूल्यों को छोड़कर, सम्मिलित योजना में <code>NIL</code> के समकक्ष सहित, जो इस <code>'()</code> रूप में लिखा गया है, बूलियन व्यंजक में सही मान का मूल्यांकन करें। (आर5आरएस सेकंड 6.3.1)<ref name="r5rs" />


जहां सत्य के बूलियन मान का प्रतिनिधित्व करने वाला स्थिरांक <code>T</code> है,  अधिकांश लिस्प्स में, योजना में <code>#t</code> यह है।
जहां सत्य के बूलियन मान का प्रतिनिधित्व करने वाला स्थिरांक <code>T</code> है,  अधिकांश लिप्स में, योजना में <code>#t</code> यह है।


=== आदिम डेटाटाइप्स की विसंगति ===
=== आदिम डेटाटाइप्स की विसंगति ===
Line 469: Line 535:


=== इनपुट/आउटपुट ===
=== इनपुट/आउटपुट ===
योजना का इनपुट और आउटपुट पोर्ट डेटाटाइप पर आधारित है। (आर5आरएस सेकंड 6.6)<ref name="r5rs"/>  आर5आरएस प्रक्रियाओं के साथ दो डिफ़ॉल्ट पोर्ट <code>current-input-port</code> और <code>current-output-port</code> को परिभाषित करता है, जो मानक धाराओं की यूनिक्स धारणाओं के अनुरूप है। अधिकांश कार्यान्वयन <code>current-error-port</code> भी प्रदान करते हैं, इनपुट और मानक आउटपुट का [[पुनर्निर्देशन (कंप्यूटिंग)]] मानक प्रक्रियाओं जैसे कि <code>with-input-from-file</code> और <code>with-output-to-file</code> मानक में समर्थित है। अधिकांश कार्यान्वयन समान पुनर्निर्देशन क्षमताओं के साथ स्ट्रिंग पोर्ट प्रदान करते हैं, एसआरएफआई 6 में वर्णित प्रक्रियाओं का उपयोग करते हुए, फाइलों के अतिरिक्त स्ट्रिंग बफ़र्स पर कई सामान्य इनपुट-आउटपुट संचालन को सक्षम करते हैं।<ref name="srfi-6">{{Cite web |last=William D Clinger |date=1999-07-01 |title=SRFI 6: Basic String Ports |url=http://srfi.schemers.org/srfi-6/srfi-6.html |access-date=2012-08-09 |publisher=The SRFI Editors, schemers.org}}</ref> आर6आरएस मानक बहुत अधिक परिष्कृत और सक्षम बंदरगाह प्रक्रियाओं और कई नए प्रकार के बंदरगाहों को निर्दिष्ट करता है।
योजना का इनपुट और आउटपुट पोर्ट डेटाटाइप पर आधारित है। (आर5आरएस सेकंड 6.6)<ref name="r5rs"/>  आर5आरएस प्रक्रियाओं के साथ दो डिफ़ॉल्ट पोर्ट <code>current-input-port</code> और <code>current-output-port</code> को परिभाषित करता है, जो मानक धाराओं की यूनिक्स धारणाओं के अनुरूप है। अधिकांश कार्यान्वयन <code>current-error-port</code> भी प्रदान करते हैं, इनपुट और मानक आउटपुट का [[पुनर्निर्देशन (कंप्यूटिंग)]] मानक प्रक्रियाओं जैसे कि <code>with-input-from-file</code> और <code>with-output-to-file</code> मानक में समर्थित है। अधिकांश कार्यान्वयन समान पुनर्निर्देशन क्षमताओं के साथ स्ट्रिंग पोर्ट प्रदान करते हैं, एसआरएफआई 6 में वर्णित प्रक्रियाओं का उपयोग करते हुए, फाइलों के अतिरिक्त स्ट्रिंग बफ़र्स पर कई सामान्य इनपुट-आउटपुट संचालन को सक्षम करते हैं।<ref name="srfi-6">{{Cite web |last=William D Clinger |date=1999-07-01 |title=SRFI 6: Basic String Ports |url=http://srfi.schemers.org/srfi-6/srfi-6.html |access-date=2012-08-09 |publisher=The SRFI Editors, schemers.org}}</ref> आर6आरएस मानक बहुत अधिक परिष्कृत और सक्षम पोर्ट प्रक्रियाओं और कई नए प्रकार के पोर्टों को निर्दिष्ट करता है।


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


उदाहरण 1: आउटपुट डिफ़ॉल्ट (वर्तमान-आउटपुट-पोर्ट) के साथ:
उदाहरण 1: आउटपुट डिफ़ॉल्ट (वर्तमान-आउटपुट-पोर्ट) के साथ:<syntaxhighlight>
 
(let ((hello0 (lambda() (display "Hello world") (newline))))
(let ((hello0 (lambda() (display "Hello world") (newline))))
  (hello0))
</syntaxhighlight>'''(let ((hello0 (lambda() (display "Hello world") (newline))))'''


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


उदाहरण 2: 1 के रूप में, लेकिन आउटपुट प्रक्रियाओं के लिए वैकल्पिक पोर्ट तर्क का उपयोग करना:<syntaxhighlight>
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))
  (hello1 (current-output-port)))
</syntaxhighlight>'''(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))'''


(hello1 (current-output-port)))
'''(hello1 (current-output-port)))'''
 
उदाहरण 3: 1 के रूप में, लेकिन आउटपुट को नई बनाई गई फ़ाइल पर पुनर्निर्देशित किया जाता है
 
<nowiki>;;</nowiki> NB<nowiki>:</nowiki> with-output-to-file is an optional procedure in R5RS


उदाहरण 3: 1 के रूप में, लेकिन आउटपुट को नई बनाई गई फ़ाइल पर पुनर्निर्देशित किया जाता है:<syntaxhighlight>
;; NB: with-output-to-file is an optional procedure in R5RS
(let ((hello0 (lambda () (display "Hello world") (newline))))
(let ((hello0 (lambda () (display "Hello world") (newline))))
(with-output-to-file "helloworldoutputfile" hello0))
  (with-output-to-file "helloworldoutputfile" hello0))
उदाहरण 4:2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए स्पष्ट फ़ाइल खुली और बंदरगाह बंद है
</syntaxhighlight>'''<nowiki>;;</nowiki> NB<nowiki>:</nowiki> with-output-to-file is an optional procedure in R5RS'''


'''(let ((hello0 (lambda () (display "Hello world") (newline))))'''
उदाहरण 4: 2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए स्पष्ट फ़ाइल खुली और पोर्ट बंद है:<syntaxhighlight>
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p)))
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p)))
    (output-port (open-output-file "helloworldoutputfile")))
      (output-port (open-output-file "helloworldoutputfile")))
 
  (hello1 output-port)
  (hello1 output-port)
  (close-output-port output-port))
  (close-output-port output-port))
</syntaxhighlight>'''(let ((hello1 (lambda (p) (display "Hello world" p) (newline p)))'''
उदाहरण 5: 2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए कॉल-विद-आउटपुट-फाइल का उपयोग करने के साथ।
    '''(output-port (open-output-file "helloworldoutputfile")))'''


  '''(hello1 output-port)
  (close-output-port output-port))'''
उदाहरण 5: 2 के रूप में, लेकिन फ़ाइल में आउटपुट भेजने के लिए कॉल-विद-आउटपुट-फाइल का उपयोग करने के साथ:<syntaxhighlight>
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))
(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))
   (call-with-output-file "helloworldoutputfile" hello1))
   (call-with-output-file "helloworldoutputfile" hello1))
इनपुट के लिए समान प्रक्रियाएं प्रदान की जाती हैं। आर5आरएस योजना विधेय  <code>input-port?</code> और <code>output-port?</code> प्रदान करती है। चरित्र इनपुट और आउटपुट के लिए, <code>write-char</code>, <code>read-char</code>, <code>peek-char</code> और <code>char-ready?</code> उपलब्ध कराए गए हैं। योजना के भाव लिखने और पढ़ने के लिए, <code>write</code> और <code>read</code> योजना प्रदान करती है। रीड ऑपरेशन पर, यदि इनपुट पोर्ट फ़ाइल के अंत तक पहुँच गया है, तो लौटाया गया परिणाम फ़ाइल का अंत है, और इसे विधेय <code>eof-object?</code> का उपयोग करके परीक्षण किया जा सकता है।
</syntaxhighlight>इनपुट के लिए समान प्रक्रियाएं प्रदान की जाती हैं। आर5आरएस योजना विधेय  <code>input-port?</code> और <code>output-port?</code> प्रदान करती है। चरित्र इनपुट और आउटपुट के लिए, <code>write-char</code>, <code>read-char</code>, <code>peek-char</code> और <code>char-ready?</code> उपलब्ध कराए गए हैं। योजना के भाव लिखने और पढ़ने के लिए, <code>write</code> और <code>read</code> योजना प्रदान करती है। रीड ऑपरेशन पर, यदि इनपुट पोर्ट फ़ाइल के अंत तक पहुँच गया है, तो लौटाया गया परिणाम फ़ाइल का अंत है, और इसे विधेय <code>eof-object?</code> का उपयोग करके परीक्षण किया जा सकता है।


मानक के अतिरिक्त, एसआरएफआई 28 सामान्य लिस्प के समान मूलभूत स्वरूपण प्रक्रिया को परिभाषित करता है, जिसके बाद इसका नाम <code>format</code> कार्य दिया गया है।<ref name="srfi-28">{{Cite web |last=Scott G. Miller |date=2002-06-25 |title=SRFI 28: Basic Format Strings |url=http://srfi.schemers.org/srfi-28/srfi-28.html |access-date=2012-08-09 |publisher=The SRFI Editors, schemers.org}}</ref>
मानक के अतिरिक्त, एसआरएफआई 28 सामान्य लिस्प के समान मूलभूत स्वरूपण प्रक्रिया को परिभाषित करता है, जिसके बाद इसका नाम <code>format</code> कार्य दिया गया है।<ref name="srfi-28">{{Cite web |last=Scott G. Miller |date=2002-06-25 |title=SRFI 28: Basic Format Strings |url=http://srfi.schemers.org/srfi-28/srfi-28.html |access-date=2012-08-09 |publisher=The SRFI Editors, schemers.org}}</ref>
Line 509: Line 580:


=== मानक प्रक्रियाओं की पुनर्व्याख्या ===
=== मानक प्रक्रियाओं की पुनर्व्याख्या ===
योजना में, प्रक्रियाएं चर के लिए बाध्य हैं। आर5आरएस में भाषा मानक औपचारिक रूप से अनिवार्य है कि कार्यक्रम अंतर्निहित प्रक्रियाओं के चर बंधनों को बदल सकते हैं, उन्हें प्रभावी ढंग से पुनर्परिभाषित कर सकते हैं। आर5आरएस भाषा परिवर्तन,<ref name="r5rs"/>  उदाहरण के लिए, स्ट्रिंग्स के साथ-साथ संख्याओं को फिर से परिभाषित करके स्वीकार करने के लिए <code>+</code> का विस्तार किया जा सकता है:
योजना में, प्रक्रियाएं चर के लिए बाध्य हैं। आर5आरएस में भाषा मानक औपचारिक रूप से अनिवार्य है कि कार्यक्रम अंतर्निहित प्रक्रियाओं के चर बंधनों को बदल सकते हैं, उन्हें प्रभावी ढंग से पुनर्परिभाषित कर सकते हैं। आर5आरएस भाषा परिवर्तन,<ref name="r5rs"/>  उदाहरण के लिए, स्ट्रिंग्स के साथ-साथ संख्याओं को फिर से परिभाषित करके स्वीकार करने के लिए <code>+</code> का विस्तार किया जा सकता है:<syntaxhighlight>
       (set! +
(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"
</syntaxhighlight>
       '''(set! +'''


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


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


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


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


आर3आरएस, संशोधित के बाद से मानकों के दस्तावेजों के शीर्षक का रूप कलनविधि भाषा योजना पर सूची, एल्गोल मानक दस्तावेज़ के शीर्षक का संदर्भ है, कलनविधि भाषा एल्गोल 60 पर संशोधित सूची, आर3आरएस का सारांश पृष्ठ एल्गोल 60 सूची के सारांश पृष्ठ पर शुद्धता से तैयार किया गया है .<ref name="algol_report">{{Cite journal |last=J.W. Backus |last2=F.L. Bauer |last3=J.Green |last4=C. Katz |last5=J. McCarthy P. Naur |display-authors=etal |date=January–April 1960 |title=एल्गोरिद्मिक लैंग्वेज एल्गोल 60 पर संशोधित रिपोर्ट|url=http://www.masswerk.at/algol60/report.htm |journal=Numerische Mathematik, Communications of the ACM, and Journal of the British Computer Society |access-date=2012-08-09}}</रेफरी><ref name="r3rs">{{Cite journal |date=December 1986 |editor2-last=William Clinger |title=Revised(3) Report on the Algorithmic Language Scheme (Dedicated to the Memory of ALGOL 60) |url=http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r3rs-html/r3rs_toc.html |journal=ACM SIGPLAN Notices |volume=21 |issue=12 |pages=37–79 |citeseerx=10.1.1.29.3015 |doi=10.1145/15042.15043 |access-date=2012-08-09 |editor=Jonathan Rees |hdl=1721.1/6424 |s2cid=43884422}}</ref>
आर3आरएस, संशोधित के बाद से मानकों के दस्तावेजों के शीर्षक का रूप कलनविधि भाषा योजना पर सूची, एल्गोल मानक दस्तावेज़ के शीर्षक का संदर्भ है, कलनविधि भाषा एल्गोल 60 पर संशोधित सूची, आर3आरएस का सारांश पृष्ठ एल्गोल 60 सूची के सारांश पृष्ठ पर शुद्धता से तैयार किया गया है।<ref name="algol_report">{{Cite journal |last=J.W. Backus |last2=F.L. Bauer |last3=J.Green |last4=C. Katz |last5=J. McCarthy P. Naur |display-authors=etal |date=January–April 1960 |title=एल्गोरिद्मिक लैंग्वेज एल्गोल 60 पर संशोधित रिपोर्ट|url=http://www.masswerk.at/algol60/report.htm |journal=Numerische Mathematik, Communications of the ACM, and Journal of the British Computer Society |access-date=2012-08-09}}</रेफरी><ref name="r3rs">{{Cite journal |date=December 1986 |editor2-last=William Clinger |title=Revised(3) Report on the Algorithmic Language Scheme (Dedicated to the Memory of ALGOL 60) |url=http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r3rs-html/r3rs_toc.html |journal=ACM SIGPLAN Notices |volume=21 |issue=12 |pages=37–79 |citeseerx=10.1.1.29.3015 |doi=10.1145/15042.15043 |access-date=2012-08-09 |editor=Jonathan Rees |hdl=1721.1/6424 |s2cid=43884422}}</ref>





Revision as of 00:21, 3 March 2023

योजना
Lambda lc.svg
Paradigmsबहु-प्रतिमान: कार्यात्मक, अनिवार्य, मेटा
परिवारलिस्प
द्वारा डिज़ाइन किया गयागाय एल. स्टील
गेराल्ड जे सुस्मान
पहली प्रस्तुतिTemplate:प्रारंभ तिथि और उम्र
Stable release
टाइपिंग अनुशासनडायनेमिक, अव्यक्त, ठोस
स्कोपलेक्सिकल
फ़ाइल नाम एक्सटेंशनएस.scm, .ss
वेबसाइटwww.scheme.org
Major implementations
Many
(see योजना कार्यान्वयन)
Influenced by
एल्गोल, लिस्प, एमडीएल
Influenced
क्लोजर, सामान्य लिस्प, डायलन, यूलिस्प, हास्केल, हॉप, जावास्क्रिप्ट, जूलिया, लुआ, मल्टीलिस्प, पायथन, आर, रैकेट, रूबी, रस्ट, एस, स्कैला, टी

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

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



इतिहास


उत्पत्ति

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

आर6आरएस

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

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

वर्तमान में विभिन्न योजना कार्यान्वयनों की नवीनतम रिलीज़[6] आर6आरएस मानक का समर्थन करता है। आर6आरएस के लिए प्रस्तावित निहित रूप से चरणबद्ध पुस्तकालयों का पोर्टेबल संदर्भ कार्यान्वयन है, जिसे वाक्य-विन्यास कहा जाता है, जो विभिन्न पुराने योजना कार्यान्वयनों पर ठीक से लोड और बूटस्ट्रैप करता है। रेफ नाम = वाक्य-विन्यास>अब्दुलअज़ीज़ ग़ुलाम (2007-10-27). "R6RS लाइब्रेरी और वाक्य-विन्यास-केस प्रणाली (वाक्य-विन्यास)". इकारस योजना. Retrieved 2009-10-20.</रेफरी>

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

रेफरी>Keep, Andrew W.; Dybvig, R. Kent (November 2014). "स्कीम रिकॉर्ड प्रकारों का रन-टाइम प्रतिनिधित्व". Journal of Functional Programming. 24 (6): 675–716. doi:10.1017/S0956796814000203. S2CID 40001845.</रेफरी>

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

आर7आरएस

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

आर7आरएस (छोटी भाषा) का नौवां मसौदा 15 अप्रैल, 2013 को उपलब्ध कराया गया था। रेफरी नाम= आर7आरएस-ड्राफ्ट-9 >"R7RS 9वां ड्राफ्ट उपलब्ध है" (PDF). 2013-04-15.</ref> इस मसौदे की पुष्टि करने वाला मत 20 मई 2013 को समाप्त हुआ,[10]


लैम्ब्डा कैलकुस

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

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

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

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

;; 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)

;; 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) के रूप में जाना जाता है।[2] मानक इन्हें सार के रूप में मानता है, और कार्यान्वयनकर्ता को किसी विशेष आंतरिक अभ्यावेदन के लिए प्रतिबद्ध नहीं करता है।

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

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

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

उदाहरण 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

;; 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

;; 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आरएस के अनुरूप नहीं है क्योंकि यह पूर्ण संख्यात्मक टावर को प्रयुक्त नहीं करता है।

विलंबित मूल्यांकन

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

(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

(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

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

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

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

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

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

;; 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)[2]

(let ((ev (lambda(n) (display "Evaluating ")
                     (display (if (procedure? n) "procedure" n))
                     (newline) n)))
  ((ev +) (ev 1) (ev 2)))
===> 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) का उपयोग करके भाषा में नए वाक्यात्मक निर्माण जोड़ने की अनुमति देता है।[2] इससे पहले, स्वच्छ मैक्रो प्रणाली को आर4आरएस मानक के परिशिष्ट के रूप में निम्न स्तर मैक्रो प्रणाली के साथ उच्च स्तरीय प्रणाली के रूप में हटा दिया गया था, दोनों को भाषा के अनिवार्य भाग के अतिरिक्त योजना के विस्तार के रूप में माना जाता था।[15]

स्वच्छ मैक्रो प्रणाली के कार्यान्वयन को भी syntax-rules कहा जाता है, शेष भाषा के शाब्दिक परिधि का सम्मान करना आवश्यक है। मैक्रो विस्तार के लिए विशेष नामकरण और स्कोपिंग नियमों द्वारा यह आश्वासन दिया गया है और सामान्य प्रोग्रामिंग त्रुटियों से बचा जाता है जो अन्य प्रोग्रामिंग भाषाओं के मैक्रो प्रणाली में हो सकती हैं। आर6आरएस अधिक परिष्कृत परिवर्तन प्रणाली syntax-case को निर्दिष्ट करता है, जो कुछ समय के लिए आर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 ...)))))
;; 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 ...)))))

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

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

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


पर्यावरण और ईवल

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

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

(let ((name '+))
  (let ((+ *))
    (evaluate (list name 2 3))))
(let ((name '+))
(let ((+ *))
    (evaluate (list name 2 3))))

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

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

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

(define (evaluate expr)
   (eval expr (interaction-environment)))

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

बूलियन अभिव्यक्तियों में गैर-बूलियन मूल्यों का उपचार

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

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

आदिम डेटाटाइप्स की विसंगति

योजना में आदिम डेटाटाइप अलग हैं। निम्न में से केवल विधेय किसी भी योजना वस्तु के लिए boolean?, pair?, symbol?, number?, char?, string?, vector?, port?, procedure?सही हो सकता है। (आर5आरएस सेकंड 3.2)[2]

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


समतुल्यता विधेय

योजना में तीन अलग-अलग समतुल्य वस्तुओं के बीच तीन अलग-अलग प्रकार की तुल्यता है, जो तीन अलग-अलग तुल्यता विधेय, समानता के परीक्षण के लिए संबंधपरक संचालकों eq?, eqv? और equal? द्वारा निरूपित की जाती है :

  • eq? , #f का मूल्यांकन करता है, जब तक इसके पैरामीटर स्मृति में समान डेटा ऑब्जेक्ट का प्रतिनिधित्व नहीं करते;
  • eqv? सामान्यतः eq? जैसा ही होता है, लेकिन आदिम वस्तुओं (जैसे वर्ण और संख्या) को विशेष रूप से व्यवहार करता है जिससे समान मान का प्रतिनिधित्व करने वाली संख्याएँ eqv? हों, तथापि वे एक ही वस्तु का उल्लेख न करते हों;
  • equal? यह निर्धारित करने के लिए डेटा संरचनाओं जैसे सूचियों, वैक्टर और स्ट्रिंग्स की तुलना करता है कि क्या उनके पास सर्वांगसम संरचना और eqv? सामग्री है। (आर5आरएस सेकंड 6.1)[2]

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


टिप्पणियाँ

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

इनपुट/आउटपुट

योजना का इनपुट और आउटपुट पोर्ट डेटाटाइप पर आधारित है। (आर5आरएस सेकंड 6.6)[2] आर5आरएस प्रक्रियाओं के साथ दो डिफ़ॉल्ट पोर्ट current-input-port और current-output-port को परिभाषित करता है, जो मानक धाराओं की यूनिक्स धारणाओं के अनुरूप है। अधिकांश कार्यान्वयन current-error-port भी प्रदान करते हैं, इनपुट और मानक आउटपुट का पुनर्निर्देशन (कंप्यूटिंग) मानक प्रक्रियाओं जैसे कि with-input-from-file और with-output-to-file मानक में समर्थित है। अधिकांश कार्यान्वयन समान पुनर्निर्देशन क्षमताओं के साथ स्ट्रिंग पोर्ट प्रदान करते हैं, एसआरएफआई 6 में वर्णित प्रक्रियाओं का उपयोग करते हुए, फाइलों के अतिरिक्त स्ट्रिंग बफ़र्स पर कई सामान्य इनपुट-आउटपुट संचालन को सक्षम करते हैं।[21] आर6आरएस मानक बहुत अधिक परिष्कृत और सक्षम पोर्ट प्रक्रियाओं और कई नए प्रकार के पोर्टों को निर्दिष्ट करता है।

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

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

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

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

(hello0))

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

(let ((hello1 (lambda (p) (display "Hello world" p) (newline p))))
  (hello1 (current-output-port)))

(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))

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

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

उदाहरण 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))

(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आरएस योजना विधेय input-port? और output-port? प्रदान करती है। चरित्र इनपुट और आउटपुट के लिए, write-char, read-char, peek-char और char-ready? उपलब्ध कराए गए हैं। योजना के भाव लिखने और पढ़ने के लिए, write और read योजना प्रदान करती है। रीड ऑपरेशन पर, यदि इनपुट पोर्ट फ़ाइल के अंत तक पहुँच गया है, तो लौटाया गया परिणाम फ़ाइल का अंत है, और इसे विधेय eof-object? का उपयोग करके परीक्षण किया जा सकता है।

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


मानक प्रक्रियाओं की पुनर्व्याख्या

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

(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"
     (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) में मानक सहित प्रत्येक बंधन, कुछ पुस्तकालय से संबंधित है, और सभी निर्यातित बंधन अपरिवर्तनीय हैं।[4] इस कारण से, उत्परिवर्तन द्वारा मानक प्रक्रियाओं को पुनर्परिभाषित करना प्रतिबंधित है। इसके अतिरिक्त, मानक प्रक्रिया के नाम से अलग प्रक्रिया आयात करना संभव है, जो वास्तव में पुनर्वितरण के समान है।

नामकरण और नामकरण परंपराएं

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

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

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

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

आर3आरएस, संशोधित के बाद से मानकों के दस्तावेजों के शीर्षक का रूप कलनविधि भाषा योजना पर सूची, एल्गोल मानक दस्तावेज़ के शीर्षक का संदर्भ है, कलनविधि भाषा एल्गोल 60 पर संशोधित सूची, आर3आरएस का सारांश पृष्ठ एल्गोल 60 सूची के सारांश पृष्ठ पर शुद्धता से तैयार किया गया है।Cite error: Closing </ref> missing for <ref> tag


मानक रूपों और प्रक्रियाओं की समीक्षा

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

मानक रूप

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

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

भाषा आर5आरएस योजना में मानक प्रपत्र
उद्देश्य फॉर्म
परिभाषा define
बाध्यकारी संरचनाएं lambda, do (L), let (L), let* (L), letrec (L)
सशर्त मूल्यांकन if, cond (L), case (L), and (L), or (L)
अनुक्रमिक मूल्यांकन begin (*)
पुनरावृत्ति lambda, do (L), named let (L)
वाक्यात्मक विस्तार define-syntax, let-syntax, letrec-syntax, syntax-rules (R5RS), syntax-case (R6RS)
उद्धरण quote('), unquote(,), quasiquote(`), unquote-splicing(,@)
नियत कार्य set!
विलंबित मूल्यांकन delay (L)

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

मानक प्रक्रियाएं

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

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

भाषा आर5आरएस योजना में मानक प्रक्रियाएं
उद्देश्य प्रक्रियाएं
निर्माण vector, make-vector, make-string, list
समतुल्यता विधेय eq?, eqv?, equal?, string=?, string-ci=?, char=?, char-ci=?
प्रकार रूपांतरण vector->list, list->vector, number->string, string->number, symbol->string, string->symbol, char->integer, integer->char, string->list, list->string
संख्याएँ See separate table
स्ट्रिंग्स string?, make-string, string, string-length, string-ref, string-set!, string=?, string-ci=?, string<? string-ci<?, string<=? string-ci<=?, string>? string-ci>?, string>=? string-ci>=?, substring, string-append, string->list, list->string, string-copy, string-fill!
वर्ण char?, char=?, char-ci=?, char<? char-ci<?, char<=? char-ci<=?, char>? char-ci>?, char>=? char-ci>=?, char-alphabetic?, char-numeric?, char-whitespace?, char-upper-case?, char-lower-case?, char->integer, integer->char, char-upcase, char-downcase
सदिश make-vector, vector, vector?, vector-length, vector-ref, vector-set!, vector->list, list->vector, vector-fill!
प्रतीक symbol->string, string->symbol, symbol?
जोड़े और सूचियाँ pair?, cons, car, cdr, set-car!, set-cdr!, null?, list?, list, length, append, reverse, list-tail, list-ref, memq. memv. member, assq, assv, assoc, list->vector, vector->list, list->string, string->list
पहचान विधेय boolean?, pair?, symbol?, number?, char?, string?, vector?, port?, procedure?
निरंतरता call-with-current-continuation (call/cc), values, call-with-values, dynamic-wind
वातावरण eval, scheme-report-environment, null-environment, interaction-environment (optional)
इनपुट/आउटपुट display, newline, read, write, read-char, write-char, peek-char, char-ready?, eof-object? open-input-file, open-output-file, close-input-port, close-output-port, input-port?, output-port?, current-input-port, current-output-port, call-with-input-file, call-with-output-file, with-input-from-file(optional), with-output-to-file(optional)
प्रणाली इंटरफेस load (optional), transcript-on (optional), transcript-off (optional)
विलंबित मूल्यांकन force
कार्यात्मक प्रोग्रामिंग procedure?, apply, map, for-each
बूलियन्स boolean? not

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

भाषा आर5आरएस योजना में मानक संख्यात्मक प्रक्रियाएं
उद्देश्य प्रक्रियाएं
मूल अंकगणितीय ऑपरेटर +, -, *, /, abs, quotient, remainder, modulo, gcd, lcm, expt, sqrt
भिन्नात्मक संख्याएं numerator, denominator, rational?, rationalize
सन्निकटन floor, ceiling, truncate, round
शुद्धता inexact->exact, exact->inexact, exact?, inexact?
असमानता <, <= , >, >=, =
विविध विधेय zero?, negative?, positive? odd? even?
अधिकतम और न्यूनतम max, min
त्रिकोणमिति sin, cos, tan, asin, acos, atan
घातांक exp, log
सम्मिश्र संख्याएँ make-rectangular, make-polar, real-part, imag-part, magnitude, angle, complex?
इनपुट-आउटपुट number->string, string->number
प्रकार विधेय integer?, rational?, real?, complex?, number?

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

कार्यान्वयन के लिए योजना अनुरोध

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

विभिन्न कार्यान्वयनों में अधिक व्यापक समर्थन वाले एसआरएफआई में सम्मिलित हैं:Cite error: Closing </ref> missing for <ref> tag जिनमें से अधिकांश एक दूसरे से इतने भिन्न हैं कि कार्यक्रमों को कार्यान्वयन से दूसरे कार्यान्वयन में पोर्ट करना अधिक कठिन है, और मानक भाषा के छोटे आकार का अर्थ है कि मानक, पोर्टेबल योजना में किसी भी बड़ी जटिलता का उपयोगी कार्यक्रम लिखना लगभग असंभव है।[9] प्रोग्रामरों के लिए अपनी अपील को व्यापक बनाने के प्रयास में, आर6आरएस मानक बहुत व्यापक भाषा निर्दिष्ट करता है।

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

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

उपयोग

योजना का व्यापक रूप से संख्या द्वारा उपयोग किया जाता है,Cite error: Closing </ref> missing for <ref> tag पिछले 12 वर्षों से, रैकेट (प्रोग्रामिंग भाषा) ने प्रोग्रामबायडिजाइन (पूर्व में शिक्षण योजना!) परियोजना चलाया है, जिसने लगभग 600 हाई स्कूल के शिक्षकों और हजारों हाई स्कूल के छात्रों को अल्पविकसित योजना प्रोग्रामिंग के लिए उजागर किया है। एमआईटी की पुरानी परिचयात्मक प्रोग्रामिंग कक्षा 6.001 को योजना में पढ़ाया गया था, रेफरी नाम = 6.001 >एरिक ग्रिमसन (स्प्रिंग 2005). "6.001 कंप्यूटर प्रोग्राम की संरचना और व्याख्या". एमआईटी ओपन कोर्सवेयर. Retrieved 2009-10-20. {{cite web}}: Check date values in: |date= (help)</ref> चूंकि 6.001 को और अधिक आधुनिक पाठ्यक्रमों से बदल दिया गया है, एसआईसीपी को एमआईटी में पढ़ाया जाना जारी है।[23][24] गुलाब-हुलमैन अपने अधिक उन्नत प्रोग्रामिंग भाषा अवधारणा कोर्स में योजना का उपयोग करता है।[25] ब्रैंडिस विश्वविद्यालय का कोर कोर्स, स्ट्रक्चर एंड इंटरप्रिटेशन ऑफ कंप्यूटर प्रोग्राम्स (सीओएसआई121बी), भी विशेष रूप से सैद्धांतिक कंप्यूटर वैज्ञानिक हैरी मैरसन द्वारा योजना में पढ़ाया जाता है।[26] इंडियाना विश्वविद्यालय की परिचयात्मक कक्षा, सी211, पूरी तरह से योजना में पढ़ाई जाती है। पाठ्यक्रम का स्व-पुस्तक संस्करण, सीएस 61एएस, योजना का उपयोग करना जारी रखता है।[27] येल और ग्रिनेल कॉलेज में परिचयात्मक कंप्यूटर विज्ञान पाठ्यक्रम भी योजना में पढ़ाए जाते हैं।[28] जबकि कार्यात्मक प्रोग्रामिंग को तीसरे सेमेस्टर पाठ्यक्रम सीएससीआई 2041 में विस्तार से सम्मिलित किया गया है। संदर्भ नाम = umn3 >सीएससीआई 2041—नया पाठ्यक्रम सीएसई पाठ्यचर्या समिति, मिनेसोटा विश्वविद्यालय (2019 में देखा गया) -10-25)</ref> सॉफ्टवेयर उद्योग में, टाटा कंसल्टेंसी सर्विसेज, एशिया की सबसे बड़ी सॉफ्टवेयर कंसल्टेंसी फर्म, नए कॉलेज स्नातकों के लिए अपने महीने भर चलने वाले प्रशिक्षण कार्यक्रम में योजना का उपयोग करती है।

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

  • दस्तावेज़ शैली शब्दार्थ और विशिष्टता भाषा (डीएसएसएसएल), जो एसजीएमएल स्टाइल शीट (वेब ​​डेवलपमेंट) को निर्दिष्ट करने की विधि प्रदान करता है, योजना सबसेट का उपयोग करता है।[29]
  • जाने-माने खुला स्रोत सॉफ्टवेयर रेखापुंज ग्राफिक्स संपादक जीआईएमपी स्क्रिप्टिंग भाषा के रूप में छोटी योजना का उपयोग करता है।[30]
  • [जीएनयू गुइल] को जीएनयू परियोजना द्वारा अपनी आधिकारिक स्क्रिप्टिंग भाषा के रूप में अपनाया गया है, और योजना का कार्यान्वयन एक्सटेंशन के लिए स्क्रिप्टिंग भाषा के रूप में जीएनयू लिलीपॉन्ड और जीएनयूकैश जैसे अनुप्रयोगों में अंतर्निहित है। इसी तरह, गाइल डेस्कटॉप वातावरण सूक्ति के लिए स्क्रिप्टिंग भाषा हुआ करती थी,[31] और गनोम के ​​पास अभी भी परियोजना है जो इसके लाइब्रेरी स्टैक को गुइल बाइंडिंग प्रदान करता है।[32]
  • फ़ाइनल फ़ैंटेसी: स्पिरिट्स विदिन फ़िल्म के वरिष्ठ प्रोग्रामर शिरो कवाई ने रीयल-टाइम रेंडरिंग इंजन के प्रबंधन के लिए स्क्रिप्टिंग भाषा के रूप में योजना का उपयोग किया।<ref name="शिरो_कवाई">कवाई, शिरो (अक्टूबर 2002). "ग्लूइंग थिंग्स टुगेदर - स्कीम इन रियल-टाइम सीजी कंटेंट प्रोडक्शन". प्रथम अंतर्राष्ट्रीय लिस्प सम्मेलन, सैन फ्रांसिस्को की कार्यवाही: 342–348. Retrieved 2012-08-09. {{cite journal}}: Check date values in: |date= (help)</रेफरी>
  • एंड्रॉइड (ऑपरेटिंग प्रणाली) के लिए गूगल ऐप आविष्कारक योजना का उपयोग करता है, जहां कावा (योजना कार्यान्वयन) का उपयोग एंड्रॉयड उपकरणों पर चलने वाली जावा वर्चुअल मशीन के लिए योजना कोड को बाइट-कोड में संकलित करने के लिए किया जाता है।

रेफरी नाम = एंड्रॉइड>बिल मैग्नसन; हैल एबेलसन; मार्क फ्रीडमैन (2009-08-11). "एंड्रॉयड के लिए ऐप आविष्कारक के दायरे में". गूगल इंक, आधिकारिक गूगल शोध ब्लॉग. Retrieved 2012-08-09. {{cite web}}: Invalid |name-list-style=एम्प (help)</रेफरी>

यह भी देखें

संदर्भ

  1. कॉमन LISP: द लैंग्वेज, दूसरा संस्करण, गाय एल. स्टील जूनियर डिजिटल प्रेस; 1981. ISBN 978-1-55558-041-4. कॉमन लिस्प लिस्प की एक नई बोली है, जो मैकलिस्प की उत्तराधिकारी है, जो ज़ेटालिस्प और कुछ हद तक स्कीम और इंटरलिस्प से प्रभावित है। </रेफरी> इंस्टीट्यूट ऑफ़ इलेक्ट्रिकल एंड इलेक्ट्रॉनिक्स इंजीनियर्स मानक के आधिकारिक संस्थान में मानकीकृत है रेफ नाम = ieee1178 >1178-1990 (रीफ 2008) योजना प्रोग्रामिंग भाषा के लिए IEEE मानक। IEEE भाग संख्या STDPD14209, सर्वसम्मति से पुन: पुष्टि IEEE-SA मानक बोर्ड मानक समीक्षा समिति (RevCom) की बैठक में, 26 मार्च, 2008 (आइटम 6.3) मिनट पर), पुन: पुष्टि मिनट अक्टूबर 2009 तक पहुँचा। नोट: यह दस्तावेज़ केवल IEEE से खरीदने के लिए उपलब्ध है और लेखन के समय (2009) ऑनलाइन उपलब्ध नहीं है।
  2. 2.00 2.01 2.02 2.03 2.04 2.05 2.06 2.07 2.08 2.09 2.10 2.11 2.12 2.13 Richard Kelsey; William Clinger; Jonathan Rees; et al. (August 1998). "Revised5 Report on the Algorithmic Language Scheme". Higher-Order and Symbolic Computation. 11 (1): 7–105. doi:10.1023/A:1010051815785. S2CID 14069423. Retrieved 2012-08-09.
  3. "R7RS final available" (PDF). 2013-07-06.
  4. 4.0 4.1 4.2 4.3 Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (August 2007). "Revised6 Report on the Algorithmic Language Scheme (R6RS)". Scheme Steering Committee. Retrieved 2011-09-13.
  5. 5.0 5.1 Sussman, Gerald Jay; Steele, Guy L. (1 December 1998). "The First Report on Scheme Revisited". Higher-Order and Symbolic Computation. 11 (4): 399–404. doi:10.1023/A:1010079421970. S2CID 7704398.
  6. "R6RS कार्यान्वयन". r6rs.org. Retrieved 2017-11-24.
  7. "एल्गोरिद्मिक लैंग्वेज स्कीम पर संशोधित^6 रिपोर्ट, परिशिष्ट ई: भाषा परिवर्तन". Scheme Steering Committee. 2007-09-26. Retrieved 2009-10-20.
  8. "R6RS मतदाता". Scheme Steering Committee. 2007. Retrieved 2012-08-09.</रेफरी><ref name="r6rs_feeley">Marc Feeley (compilation) (2007-10-26). "R6RS से संबंधित कार्यान्वयनकर्ताओं के इरादे". Scheme Steering Committee, r6rs-discuss mailing list. Retrieved 2012-08-09.
  9. 9.0 9.1 Will Clinger, Marc Feeley, Chris Hanson, Jonathan Rees and Olin Shivers (2009-08-20). "स्थिति विवरण (ड्राफ्ट)". Scheme Steering Committee. Retrieved 2012-08-09.{{cite web}}: CS1 maint: multiple names: authors list (link)
  10. Will Clinger (2013-05-10). "मतदान अवधि का विस्तार". Scheme Language Steering Committee, scheme-reports mailing list. Archived from the original on 2013-07-21. Retrieved 2013-07-07.</रेफरी> और अंतिम रिपोर्ट 6 अगस्त 2013 से उपलब्ध है, उस प्रयास की 'छोटी' भाषा का वर्णन: इसलिए इसे अलगाव में R6RS के उत्तराधिकारी के रूप में नहीं माना जा सकता है।
    1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
     LISP 1, 1.5, LISP 2(abandoned)
     Maclisp
     Interlisp
     MDL
     Lisp Machine Lisp
     Scheme  R5RS  R6RS  R7RS small
     NIL
     ZIL (Zork Implementation Language)
     Franz Lisp
     Common Lisp  ANSI standard
     Le Lisp
     MIT Scheme
     T
     Chez Scheme
     Emacs Lisp
     AutoLISP
     PicoLisp
     Gambit
     EuLisp
     ISLISP
     OpenLisp
     PLT Scheme  Racket
     GNU Guile
     Visual LISP
     Clojure
     Arc
     LFE
     Hy

    विशिष्ट विशेषताएं

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

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

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

    अतिसूक्ष्मवाद

    योजना एक बहुत ही सरल भाषा है, तुलनीय अभिव्यंजक शक्ति (कंप्यूटर विज्ञान) की कई अन्य भाषाओं की तुलना में इसे लागू करना बहुत आसान है।<ref name="easy_to_implement_scheme48">स्कीम 48 कार्यान्वयन को इसलिए नाम दिया गया है क्योंकि दुभाषिया रिचर्ड केल्सी और जोनाथन रीस द्वारा 48 घंटे (6 अगस्त) में लिखा गया था। – 7वां, 1986. देखें Richard Kelsey; Jonathan Rees; Mike Sperber (2008-01-10). "अपूर्ण योजना 48 संदर्भ मैनुअल 1.8 जारी करने के लिए". Jonathan Rees, s48.org. Retrieved 2012-08-09.</ रेफ> यह आसानी लैम्ब्डा कैलकुस के उपयोग के कारण भाषा के वाक्य-विन्यास को अधिक आदिम रूपों से प्राप्त करने के लिए जिम्मेदार है। उदाहरण के लिए, R5RS योजना मानक में परिभाषित 23 s-एक्सप्रेशन-आधारित सिंटैक्टिक निर्माण, 14 को व्युत्पन्न या पुस्तकालय रूपों के रूप में वर्गीकृत किया गया है, जिन्हें मैक्रोज़ के रूप में लिखा जा सकता है जिसमें अधिक मौलिक रूप शामिल हैं, मुख्य रूप से लैम्ब्डा। जैसा कि R5RS (§3.1) कहता है: वेरिएबल बाइंडिंग कंस्ट्रक्शन का सबसे मौलिक लैम्ब्डा एक्सप्रेशन है, क्योंकि अन्य सभी वेरिएबल बाइंडिंग कंस्ट्रक्शन को लैम्ब्डा एक्सप्रेशन के संदर्भ में समझाया जा सकता है।

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

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

    <वाक्यविन्यास लैंग = योजना> (परिभाषित-वाक्यविन्यास let

     (वाक्यविन्यास-नियम ()
       ((चलो ((var expr) ...) शरीर ...)
         ((लैम्ब्डा (var ...) बॉडी ...) expr ...))))
    

    </वाक्यविन्यास हाइलाइट>

    इस प्रकार उपयोग करना let जैसा कि एक योजना कार्यान्वयन के ऊपर परिभाषित किया गया है, फिर से लिखा जाएगा(let ((a 1)(b 2)) (+ b a))जैसा((lambda (a b) (+ b a)) 1 2), जो कार्यान्वयन के कार्य को कोडिंग प्रक्रिया के तात्कालिकता के कार्य तक कम कर देता है।

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

    लेक्सिकल स्कोप

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

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

    लिस्प बोली में लेक्सिकल स्कोपिंग को कैसे पेश किया जाए, इस पर प्रमुख अंतर्दृष्टि को सुस्मान और स्टील के 1975 लैम्ब्डा पेपर, स्कीम: एन इंटरप्रेटर फॉर एक्सटेंडेड लैम्ब्डा कैलकुलस में लोकप्रिय बनाया गया था।<ref name="lambda_paper_1">Gerald Jay Sussman & Guy Lewis Steele Jr. (December 1975). "योजना: विस्तारित लैम्ब्डा कैलकुलस के लिए एक दुभाषिया" (PDF). AI Memos. MIT AI Lab. AIM-349. hdl:1721.1/5794. Retrieved 23 December 2021.</ रेफ> जहां उन्होंने क्लोजर (कंप्यूटर विज्ञान) (पृष्ठ 21 पर) की अवधारणा को अपनाया, जिसे 1970 में एआई मेमो में जोएल मूसा द्वारा वर्णित किया गया था, जिन्होंने इस विचार को पीटर जे लैंडिन को जिम्मेदार ठहराया था।<ref name="Moses">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.

  11. van Tonder, André (1 January 2004). "A Lambda Calculus for Quantum Computation". SIAM Journal on Computing. 33 (5): 1109–1135. arXiv:quant-ph/0307150. doi:10.1137/S0097539703432165. S2CID 613571.
  12. Niehren, J.; Schwinghammer, J.; Smolka, G. (November 2006). "A concurrent lambda calculus with futures" (PDF). Theoretical Computer Science. 364 (3): 338–356. doi:10.1016/j.tcs.2006.08.016.
  13. Gerald Jay Sussman & Guy Lewis Steele Jr. (March 1976). "लैम्ब्डा: द अल्टीमेट इंपीरेटिव". AI Memos. MIT AI Lab. AIM-353. Archived from the original (postscript or PDF) on 2016-05-10. Retrieved 2012-08-09.</रेफरी> उन्होंने लैम्ब्डा पेपर्स के पहले में योजना के अपने पहले विवरण के साथ निरंतरता-पासिंग शैली की शुरुआत की, और बाद के पेपरों में, वे लैम्ब्डा कैलकुस के इस व्यावहारिक उपयोग की कच्ची शक्ति का प्रदर्शन करने के लिए आगे बढ़े।

    ब्लॉक संरचना

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

    <वाक्यविन्यास लैंग = योजना> (var हंस परिभाषित करें)

    यहाँ var का कोई भी संदर्भ हंस के लिए बाध्य होगा

    (चलो ((वर 10))

     ;; बयान यहाँ जाते हैं। यहां var का कोई भी संदर्भ 10 तक सीमित रहेगा।
     )
    
    यहाँ var का कोई भी संदर्भ हंस के लिए बाध्य होगा

    </वाक्यविन्यास हाइलाइट>

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

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

    <वाक्यविन्यास लैंग = योजना> (चलो * ((var1 10)

          (var2 (+ var1 12)))
     ;; लेकिन var1 की परिभाषा var2 को संदर्भित नहीं कर सकी
     )
    

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

    <वाक्यविन्यास लैंग = योजना>

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

    (परिभाषित करें (हॉफस्टाटर-नर-मादा एन)

     (लेट्रेक ((महिला (लैम्ब्डा (एन)
    

    (यदि (= 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) ) </वाक्यविन्यास हाइलाइट> (इस उदाहरण में प्रयुक्त परिभाषाओं के लिए हॉफस्टाटर अनुक्रम# हॉफस्टाटर महिला और पुरुष अनुक्रम देखें। हॉफस्टैटर के नर और मादा अनुक्रम देखें।)

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

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

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

    <वाक्यविन्यास लैंग = योजना> (लेट लूप ((एन 1))

     (अगर (> एन 10)
         '()
         (विपक्ष एन
    

    (लूप (+ n 1)))))

    ===> (1 2 3 4 5 6 7 8 9 10) </वाक्यविन्यास हाइलाइट>

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

    उचित पूंछ पुनरावर्तन

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

    <वाक्यविन्यास लैंग = योजना>

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

    (परिभाषित करें (वर्गों की सूची n)

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

    (वर्गों की सूची 9) ===> (0 1 4 9 16 25 36 49 64 81) </वाक्यविन्यास हाइलाइट>

    प्रथम श्रेणी निरंतरता

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

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

    <वाक्यविन्यास लैंग = योजना> (परिभाषित करें (ढूंढें-पहले func lst)

     (कॉल-साथ-वर्तमान-निरंतरता
      (लैम्ब्डा (वापसी-तत्काल)
        (प्रत्येक के लिए (लैम्ब्डा (एक्स)
    

    (अगर (फंक एक्स) (वापसी-तुरंत x))) प्रथम)

        #एफ)))
    

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

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

    <वाक्यविन्यास लैंग = योजना> (चलो * ((यिन

            ((लैम्ब्डा (सीसी) (प्रदर्शन @ ) सीसी) (कॉल-साथ-वर्तमान-निरंतरता (लैम्ब्डा (सी) सी)))
          (यांग
            ((लैम्ब्डा (सीसी) (प्रदर्शन * ) सीसी) (कॉल-साथ-वर्तमान-निरंतरता (लैम्ब्डा (सी) सी)))))
       (यिन यांग))
    

    </वाक्यविन्यास हाइलाइट> निष्पादित होने पर यह कोड एक गिनती अनुक्रम प्रदर्शित करता है: @*@**@***@****@*****@******@*******@********...

    प्रक्रियाओं और चर के लिए साझा नाम स्थान

    कॉमन लिस्प के विपरीत, योजना में सभी डेटा और प्रक्रियाएं एक सामान्य नाम स्थान साझा करती हैं, जबकि कॉमन लिस्प में कॉमन लिस्प#फ़ंक्शन नेमस्पेस एक फ़ंक्शन और एक चर के लिए एक ही नाम को संभव बनाता है, और एक को संदर्भित करने के लिए विशेष संकेतन की आवश्यकता होती है। मूल्य के रूप में कार्य करें। इसे कभी-कभी लिस्प-1 बनाम लिस्प-2 भेद के रूप में जाना जाता है, जो योजना के एकीकृत नामस्थान और कॉमन लिस्प के अलग-अलग नामस्थानों का संदर्भ देता है।<ref>Gabriel, Richard P.; Pitman, Kent (1988). "Technical Issues of Separation in Function Cells and Value Cells". Lisp and Symbolic Computation. Vol. 1, no. 1 (published June 1988). pp. 81–101. doi:10.1007/BF01806178. Retrieved 2012-08-09.

  14. 14.0 14.1 Philip L. Bewig (2008-01-24). "SRFI 41: Streams". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  15. William Clinger and Jonathan Rees, ed. (1991). "Revised4 Report on the Algorithmic Language Scheme". ACM Lisp Pointers. 4 (3): 1–55. Retrieved 2012-08-09.
  16. Flatt, Matthew (2016). "Binding as sets of scopes". Proceedings of the 43rd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. pp. 705–717. doi:10.1145/2837614.2837620. ISBN 978-1-4503-3549-2. S2CID 15401805.
  17. Cite error: Invalid <ref> tag; no text was provided for refs named lambda_paper_1
  18. जोनाथन रीस, द स्कीम ऑफ़ थिंग्स द जून 1992 मीटिंग Archived 2011-07-16 at the Wayback Machine (पोस्टस्क्रिप्ट), लिस्प पॉइंटर्स में, वी (4), अक्टूबर-दिसंबर 1992। पुनःप्राप्त 2012-08-09
  19. Cite error: Invalid <ref> tag; no text was provided for refs named ieee1178
  20. Taylor Campbell (2005-07-21). "SRFI 62: S-expression comments". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  21. William D Clinger (1999-07-01). "SRFI 6: Basic String Ports". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  22. Scott G. Miller (2002-06-25). "SRFI 28: Basic Format Strings". The SRFI Editors, schemers.org. Retrieved 2012-08-09.
  23. Alex Vandiver; Nelson Elhage; et al. (January 2009). "6.184 - जॉम्बी कैफीन युक्त पेय 6.001". MIT CSAIL. Retrieved 2009-10-20.</ रेफ> इसी तरह, यूसी बर्कले, सीएस 61ए में प्रारंभिक कक्षा, 2011 तक पूरी तरह से योजना में सिखाई गई थी, गतिशील दायरे को प्रदर्शित करने के लिए लोगो (प्रोग्रामिंग भाषा) में मामूली विचलन को बचाएं। आज, एमआईटी की तरहयूसी बरकेले ने पाठ्यक्रम को एक अधिक आधुनिक संस्करण के साथ बदल दिया है जो मुख्य रूप से पायथन (प्रोग्रामिंग भाषा) में पढ़ाया जाता है, लेकिन वर्तमान पाठ्यक्रम अभी भी पुराने पाठ्यक्रम पर आधारित है, और कक्षा के कुछ हिस्सों को अभी भी योजना में पढ़ाया जाता है। रेफरी नाम = 61ए >John DeNero (Fall 2019). "कंप्यूटर साइंस 61A, बर्कले". Department of Electrical Engineering and Computer Sciences, Berkeley. Retrieved 2019-12-17.</रेफरी> माथियास फेलिसन द्वारा पाठ्यपुस्तक प्रोग्राम कैसे डिजाइन करें, वर्तमान में नॉर्थईस्टर्न विश्वविद्यालय में, उच्च शिक्षा के कुछ संस्थानों द्वारा उनके परिचयात्मक कंप्यूटर विज्ञान पाठ्यक्रमों के लिए उपयोग की जाती है। नॉर्थईस्टर्न यूनिवर्सिटी और वॉर्सेस्टर पॉलिटेक्निक संस्थान दोनों ही योजना का उपयोग विशेष रूप से उनके परिचयात्मक पाठ्यक्रम फंडामेंटल ऑफ कंप्यूटर साइंस (CS2500) और इंट्रोडक्शन टू प्रोग्राम डिजाइन (CS1101) के लिए करते हैं। संदर्भ नाम = neu >CS 2500: कंप्यूटर साइंस I के बुनियादी सिद्धांत, पूर्वोत्तर विश्वविद्यालय
  24. CS 1101: Introduction to Program Design (A05): course software, Worcester Polytechnic Institute
  25. "CSSE 304: Programming Language Concepts". Rose-Hulman Institute of Technology.
  26. "Spring 2021 CS121b Syllabus" (PDF). Brandeis University.
  27. "Home". berkeley-cs61as.github.io.
  28. Dana Angluin (Fall 2009). "कंप्यूटर विज्ञान का परिचय (सीपीएससी 201)". The Zoo, Yale University Computer Science Department. Retrieved 2009-10-20.</रेफरी> प्रोग्रामिंग डिजाइन प्रतिमान, रेफरी नाम = neu2 >"प्रोग्रामिंग डिजाइन प्रतिमान CSG107 कोर्स रीडिंग". Northeastern University College of Computer and Information Science. Fall 2009. Retrieved 2012-08-09.</रेफरी> पूर्वोत्तर विश्वविद्यालय में कंप्यूटर विज्ञान स्नातक छात्रों के लिए एक अनिवार्य पाठ्यक्रम भी व्यापक रूप से योजना का उपयोग करता है। मिनेसोटा विश्वविद्यालय में पूर्व परिचयात्मक कंप्यूटर साइंस कोर्स - ट्विन सिटीज, CSCI 1901, ने भी अपनी प्राथमिक भाषा के रूप में स्कीम का उपयोग किया, इसके बाद एक कोर्स किया जिसने छात्रों को जावा प्रोग्रामिंग भाषा से परिचित कराया; संदर्भ नाम = umn >कंप्यूटर प्रोग्रामिंग I की संरचना Archived 2010-06-19 at the Wayback Machine, कंप्यूटर विज्ञान विभाग, मिनेसोटा विश्वविद्यालय, स्प्रिंग 2010 (2010-01-30 तक पहुँचा)। </ रेफ> हालांकि, एमआईटी के उदाहरण के बाद, विभाग ने 1901 को पायथन-आधारित सीएससीआई 1133 के साथ बदल दिया, संदर्भ नाम= umn2 >CSci आवश्यक कक्षा पाठ्यक्रम विवरण और अन्य जानकारी Archived 2019-10-25 at the Wayback Machine, कंप्यूटर विज्ञान विभाग, मिनेसोटा विश्वविद्यालय (2019-10-25 तक पहुँचा)
  29. Robin Cover (2002-02-25). "DSSSL - Document Style Semantics and Specification Language. ISO/IEC 10179:1996". Cover Pages. Retrieved 2012-08-09.
  30. "The major scripting language for the GIMP that has been attached to it today is Scheme." From Dov Grobgeld (2002). "The GIMP Basic Scheme Tutorial". The GIMP Team. Retrieved 2012-08-09.
  31. Todd Graham Lewis; David Zoll; Julian Missig (2002). "इंटरनेट आर्काइव से गनोम एफएक्यू". The Gnome Team, gnome.org. Archived from the original on 2000-05-22. Retrieved 2012-08-09.
  32. "छल-सूक्ति". Free Software Foundation. Retrieved 2012-08-09.</ रेफ> मौजूदा Emacs लिस्प दुभाषिया की जगह, GNU के प्रमुख कार्यक्रम, GNU Emacs में Guile को शामिल करने की एक परियोजना है।[citation needed]


अग्रिम पठन


बाहरी संबंध