इस अभ्यास में आप कंडीशनल के बारे में सीखेंगे, यानी किसी वैल्यू के आधार पर दो या अधिक रास्तों में से एक चुनना। यह उन बूलियन पर आगे चलता है जो आपने Annalyn's Infiltration में सीखे थे, और उस पूर्णांक गणित पर जो Currency Conversion में था।
ये सभी math में रहते हैं (= के लिए kernel में):
= ( x y -- ? ) ! equal
< ( x y -- ? ) ! less than
<= ( x y -- ? ) ! less than or equal
> ( x y -- ? ) ! greater than
>= ( x y -- ? ) ! greater than or equal
3 3 = . ! => t
2 3 < . ! => t
3 3 <= . ! => t
3 4 = not . ! => t (inequality: combine = with not)
zero? (math में) आम 0 = जाँच का छोटा रूप है। यह संख्या को हटा देता है और स्टैक पर यह डालता है कि वह शून्य थी या नहीं:
zero? ( n -- ? ) ! t when n is 0
between? (math.order में) जाँचता है कि कोई वैल्यू ऐसी रेंज में आती है या नहीं जिसमें दोनों सिरे शामिल हों। यह तब काम आता है जब कोई काम इस पर निर्भर हो कि संख्या किस दायरे में पड़ती है:
between? ( x lo hi -- ? ) ! lo <= x <= hi (inclusive)
5 1 10 between? . ! => t
0 1 10 between? . ! => f
10 1 10 between? . ! => t (inclusive at both ends)
आप इसे अक्सर cond का प्रेडिकेट के रूप में देखेंगे, जैसे dup 1 4 between?, ताकि किसी एक वैल्यू के बजाय रेंज के हिसाब से शाखा चुनी जा सके।
ऊपर दिए तुलना वाले शब्द बूलियन बनाते हैं। किसी बूलियन पर काम करने के लिए आप कंडीशनल को एक या अधिक कोटेशन देते हैं। कोटेशन कोड का एक छोटा टुकड़ा होता है जो चौकोर ब्रैकेट में लपेटा रहता है, [ ... ]। इसे लिखने पर कोड चलता नहीं, बल्कि एक वैल्यू की तरह स्टैक पर चला जाता है। फिर if जैसा शब्द तय करता है कि कौन सा कोटेशन चलाना है।
[ neg ] ! a quotation that negates the top of the stack
[ ] ! the empty quotation — does nothing
कोटेशन के बारे में पूरी जानकारी आगे के किसी अभ्यास में मिलेगी। फिलहाल [ ... ] को "इस शाखा के लिए चलने वाला कोड" पढ़िए।
if, when, unless
if (kernel में) एक बूलियन और दो कोटेशन लेता है। जब बूलियन सही होता है तो यह पहला कोटेशन चलाता है, और जब गलत होता है तो दूसरा:
if ( ? then-quot else-quot -- )
: abs ( x -- y ) dup 0 < [ neg ] [ ] if ;
when अपना कोटेशन तभी चलाता है जब बूलियन सही हो; unless तभी जब वह गलत हो:
when ( ? quot -- )
unless ( ? quot -- )
if*, when*, और unless*
kernel के तीन रूप बूलियन को ऐसी वैल्यू की तरह लेते हैं जिसे सही होने पर संभालकर रखना चाहिए। यह तब काम आता है जब कोई शब्द "वह चीज़, या f" लौटाता है:
if* ( ? true false -- ) ! truthy: true is called WITH ? on stack
when* ( ? true -- ) ! truthy: true is called WITH ? on stack
unless* ( ? false -- ) ! falsy: false runs and pushes a default
if* दो शाखाओं वाला रूप है। सही वाली शाखा को वैल्यू स्टैक पर रखे-रखे कॉल किया जाता है, और गलत वाली शाखा को बिना वैल्यू के कॉल किया जाता है:
42 [ ] [ "nothing" ] if* . ! prints 42
f [ ] [ "nothing" ] if* . ! prints "nothing"
unless* "वैल्यू या डिफॉल्ट" का सबसे आम तरीका है। अगर वैल्यू सही है तो उसे वैसे ही छोड़ दिया जाता है; अगर वह f है तो वैल्यू हटा दी जाती है और कोटेशन चलकर उसकी जगह कोई और वैल्यू स्टैक पर डाल देता है:
"hello" [ "anonymous" ] unless* . ! => "hello"
f [ "anonymous" ] unless* . ! => "anonymous"
when* if* का एक-शाखा वाला रूप है। यह अपना कोटेशन, वैल्यू को स्टैक पर रखे-रखे, तभी चलाता है जब वैल्यू सही हो; और जब वह f हो तो वैल्यू को बस हटा देता है। जब आपको "वह चीज़, या f" वाला नतीजा किसी चल रही वैल्यू में जोड़ना हो और f के मामले से निपटने की ज़रूरत न हो, तब इसका इस्तेमाल कीजिए:
0 41 [ + ] when* . ! => 41 (truthy: 41 added to the running total)
0 f [ + ] when* . ! => 0 (falsy: f dropped, total left untouched)
condजब आपके पास चुनने के लिए कई विकल्प हों, तो cond (combinators में) सबसे स्वाभाविक चुनाव है। यह { predicate body } जोड़ों का एक ऐरे लेता है और पहले ऐसे प्रेडिकेट का बॉडी चलाता है जो सही वैल्यू देता है:
USING: combinators ;
: classify ( n -- label )
{
{ [ dup 0 < ] [ drop "negative" ] }
{ [ dup 0 = ] [ drop "zero" ] }
[ drop "positive" ]
} cond ;
कुछ बातें ध्यान देने लायक हैं:
dup ... <test> है।drop करके नतीजा स्टैक पर डालता है।इस अभ्यास में आप एक कार फैक्ट्री की असेंबली लाइन के उत्पादन का विश्लेषण करने के लिए कोड लिखेंगे। असेंबली लाइन की गति 0 (बंद) से 10 (अधिकतम) तक हो सकती है।
अपनी सबसे कम शून्येतर गति (1) पर यह हर घंटे 221 कारें बनाती है। उत्पादन गति के साथ रैखिक रूप से बढ़ता है, इसलिए गति 4 पर यह लाइन हर घंटे 4 * 221 = 884 कारें बनाती है। लेकिन तेज़ गति से खराब कारें बनने की संभावना बढ़ जाती है, और फिर उन्हें हटाना पड़ता है।
आपके पास चार कार्य हैं। हर कार्य स्टैक से एक पूर्णांक पैरामीटर लेता है, यानी असेंबली लाइन की गति।
production-status को इस तरह बनाइए कि जब गति 0 हो तो वह "stopped" लौटाए और किसी भी अन्य गति पर "running":
0 production-status .
! => "stopped"
3 production-status .
! => "running"
success-rate को इस तरह बनाइए कि वह किसी चीज़ के एरर के बिना बनने की संभावना लौटाए:
0: 0.0
1 से 4 तक: 1.0
5 से 8 तक: 0.9
9: 0.8
10: 0.77
10 success-rate .
! => 0.77
production-rate-per-hour को इस तरह बनाइए कि वह सफलता दर को ध्यान में रखते हुए असेंबली लाइन की प्रति घंटे उत्पादन दर लौटाए।
इसके लिए आपको पहले base-speed बनाना होगा, जो स्थिरांक 221 है।
6 production-rate-per-hour .
! => 1193.4
जो वैल्यू लौटाई जाती है वह दशमलव संख्या होती है।
working-items-per-minute को इस तरह बनाइए कि वह बताए कि हर मिनट कितनी काम करने वाली कारें बनती हैं। परिणाम एक पूर्णांक होता है, अधूरी कारें नहीं गिनी जाती हैं।
6 working-items-per-minute .
! => 19
Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।