कार्गो शफल में आप Factor के डेटा स्टैक और उसे नए क्रम में लगाने वाले शफल शब्दों से परिचित हुए थे। यह अभ्यास उसी पर आगे बढ़ता है: अब आप ऐसे शब्द बनाएँगे जो अपने इनपुट के साथ गणना करते हैं, न कि सिर्फ उन्हें इधर-उधर करते हैं।
! से लाइन कमेंट शुरू होता है, यानी Factor ! से लेकर लाइन के अंत तक सब कुछ अनदेखा कर देता है। नीचे के उदाहरणों में ! का इस्तेमाल दोनों कामों के लिए किया गया है: यह बताने के लिए कि कोड क्या करता है, और यह दिखाने के लिए कि वह क्या प्रिंट करेगा।
शब्द Factor में फंक्शन को दिया गया नाम है। किसी शब्द को कॉल करने पर स्टैक के ऊपर से कुछ वैल्यू हट जाती हैं और उनकी जगह कुछ वैल्यू स्टैक पर रख दी जाती हैं। . सबसे ऊपर की वैल्यू हटाता है और उसे प्रिंट करता है; पूर्णांक के अंकगणित वाले शब्द +, -, * दो संख्याएँ हटाते हैं और परिणाम स्टैक पर रख देते हैं:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
इससे जुड़ा एक और शब्द, .s, कुछ भी हटाए बिना पूरा डेटा स्टैक प्रिंट कर देता है। लिसनर (Factor का इंटरैक्टिव प्रॉम्प्ट, जहाँ आप कोड टाइप करते हैं और नतीजे देखते हैं) में यह इस काम आता है कि कोड का कोई टुकड़ा अपने पीछे क्या छोड़ता है, वह दिख जाए। इसी वजह से आगे के कुछ उदाहरण . के बजाय .s पर खत्म होते हैं: वे स्टैक पर एक से अधिक वैल्यू छोड़ते हैं, और .s उन सबको दिखा देता है।
अंकगणित वाले शब्द math वोकैबुलरी में रहते हैं, इसलिए जो फाइल उनका इस्तेमाल करती है, उसे अपनी USING: लाइन में math लिखना पड़ता है।
हर शब्द के साथ ( inputs -- outputs ) रूप का स्टैक इफेक्ट लिखा होता है। यह उस शब्द का करार है: यह शब्द स्टैक के ऊपर से इनपुट हटाता है और उनकी जगह आउटपुट छोड़ देता है। अंदर लिखे नाम सिर्फ इसे पढ़ने में आपकी मदद के लिए हैं। Factor उनका इस्तेमाल नहीं करता; वह सिर्फ यह ध्यान रखता है कि स्टैक में वैल्यू किस क्रम में रखी हैं।
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
स्टैक के सबसे ऊपर वाला इनपुट दाईं ओर वाला होता है। इसलिए 8 3 - में सबसे ऊपर 3 है, स्टैक इफेक्ट ( x y -- difference ) है, और नतीजा 8 - 3 होता है।
आउटपुट के अंत में लगा ? यह बताने की परंपरा है कि नतीजा "एक बूलियन" है, लेकिन लसैग्ना अभ्यास में सिर्फ संख्याएँ आती हैं।
नीचे कार्गो शफल का एक शफल शब्द आता है: swap ( x y -- y x ), जो ऊपर की दो वैल्यू उलट देता है, तब जब अगले शब्द के लिए उनका क्रम गलत हो।
: से शब्द बनाना शुरू होता है, फिर स्टैक इफेक्ट आता है, फिर बॉडी, और अंत में ; इसे खत्म करता है।
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
Factor का कंपाइलर जाँचता है कि बॉडी वाकई घोषित स्टैक इफेक्ट से मेल खाती है: जो शब्द ( x -- y ) होने का दावा करता है, पर स्टैक पर शून्य या दो वैल्यू छोड़ता है, वह कंपाइल नहीं होगा।
CONSTANT: किसी तय वैल्यू के लिए एक नाम तय करता है। स्थिरांक खुद एक शब्द होता है, इसलिए उसे कॉल करने पर वह वैल्यू स्टैक पर रख दी जाती है:
CONSTANT: pi 3
pi pi * . ! => 9
CONSTANT: मुख्य सिंटैक्स है और इसके लिए USING: लाइन की ज़रूरत नहीं होती। स्थिरांक फाइल के सबसे ऊपर रखिए, उन सभी शब्दों से पहले जो उनका इस्तेमाल करते हैं।
किसी शब्द की बॉडी उन सभी शब्दों को कॉल कर सकती है जो पहले से स्कोप में हैं, यहाँ तक कि उन्हें भी जो आपने उसी फाइल में पहले बनाए थे:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
इसी तरह अभ्यास का अंतिम काम पहले बनाए गए शब्द का फिर से इस्तेमाल करता है।
शब्द और स्थिरांक, दोनों lowercase-kebab-case इस्तेमाल करते हैं: छोटे अक्षर जो हाइफ़न से जुड़े होते हैं (जैसे expected-bake-time, preparation-time)।
इस अभ्यास में आप कुछ ऐसा कोड लिखेंगे जो आपकी पसंदीदा कुकबुक से एक शानदार लसान्या बनाने में मदद करेगा।
आपके पास चार कार्य हैं, और ये सभी लसान्या पकाने में लगने वाले समय से जुड़े हैं।
expected-bake-time कॉन्स्टेंट बनाइए, जो बताए कि लसान्या को ओवन में पकने में कितने मिनट लगेंगे।
कुकबुक के अनुसार, लसान्या को ओवन में कुल 40 मिनट तक रहना चाहिए।
expected-bake-time .
! => 40
preparation-time वर्ड बनाइए। यह स्टैक से लसान्या में डाली गई परतों की संख्या लेता है और बदले में वे मिनट छोड़ देता है जो उसे तैयार करने में लगे, यह मानते हुए कि हर परत तैयार करने में 2 मिनट लेती है।
4 preparation-time .
! => 8
remaining-time वर्ड बनाइए। यह उन मिनटों की संख्या लेता है जो लसान्या पहले ही ओवन में बिता चुका है, और बदले में वे मिनट छोड़ देता है जो उसे अभी और वहाँ रहना है।
25 remaining-time .
! => 15
total-working-time वर्ड बनाइए। यह स्टैक से दो आर्गुमेंट लेता है (पहले लसान्या की परतों की संख्या, और फिर वे मिनट जो लसान्या पहले ही ओवन में बिता चुका है) और बदले में अब तक पकाने में लगा कुल समय छोड़ देता है: तैयारी का समय और ओवन में बिताया गया समय, दोनों मिलाकर।
3 20 total-working-time .
! => 26
Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।