योजना में मुद्रण display
(और संभवतः, newline
) पर कॉल करके काम करता है। चूंकि आप इसे किसी और के बाद अनुक्रमिक रूप से कॉल करना चाहते हैं (जो, एक कार्यात्मक (या योजना के मामले में, कार्यात्मक-आश) भाषा केवल बुलाए गए कार्यों के दुष्प्रभावों के लिए समझ में आता है), आपको आमतौर पर उपयोग करने की आवश्यकता होगी begin
, जो बदले में अपने तर्कों का मूल्यांकन करता है और फिर अंतिम उप-संपीड़न का मूल्य देता है। हालांकि, lambda
में निहित रूप से begin
-expression शामिल है।
तो अपने मामले में, यह इस तरह जाना होगा:
(lambda (n)
(display n) (newline)
(cond [...]))
दो टिप्पणी:
- आप
(define factorial (lambda (n) [...]))
के लिए एक आशुलिपि के रूप में उपयोग कर सकते हैं (define (factorial n) [...])
।
- जिस तरह से आप
factorial
लागू करते हैं tail call-optimization को रोकता है, इसलिए प्रोग्राम एन के बड़े मानों के लिए काफी स्टैक स्पेस का उपयोग करेगा। हालांकि, एक संचयक का उपयोग करके इसे एक अनुकूलनीय रूप में लिखना संभव है।
आप केवल एक बार n
मुद्रित करने के लिए चाहते हैं, जब उपयोगकर्ता फ़ंक्शन को कॉल करने के लिए, आप वास्तव में, एक आवरण लिखने के लिए इस तरह की आवश्यकता होगी:
(define (factorial n)
(display n) (newline)
(inner-factorial n))
और फिर inner-factorial
करने के लिए अपने समारोह नाम बदलें।
आपको लैम्ब्डा शरीर के भीतर शुरुआत की आवश्यकता नहीं है। –
ओह thx! लेकिन स्थिति के बाद मुद्रण के बारे में कैसे? मैं वास्तव में फैक्टोरियल पर काम नहीं कर रहा हूं, लेकिन इसके साथ यह समझना आसान है। कुछ प्रिंट केवल तभी प्रिंट करें जब स्थिति सही है, यानी अगर प्रिंट करें! = 0। – ercliou
मैंने 'स्टार्ट' के बारे में हिस्सा तय किया। 'कंड'-क्लॉज के शरीर में कई अभिव्यक्तियां भी हो सकती हैं, ताकि आप आसानी से वहां 'प्रदर्शन' को कॉल कर सकें। – fnl