ट्रैक
/
Factor
Factor
/
अभ्यास
/
टेलीग्राफर का टेप
टेलीग्राफर का टेप

टेलीग्राफर का टेप

सीखने का अभ्यास

परिचय

आप channel-chatter में स्ट्रीम का इस्तेमाल पहले ही कर चुके हैं और boatswains-bilge में उन्हें dispose भी कर चुके हैं। यह अभ्यास आपकी पहली कस्टम स्ट्रीम है, यानी एक ऐसी क्लास जो प्रोटोकॉल लागू करती है, ताकि वही with-input-stream / read1 / stream-read1 कोड जो एक <string-reader> पर काम करता था, आपकी स्ट्रीम पर भी काम करे।

मिक्सिन: क्लास पदानुक्रम का दूसरा आधा हिस्सा

आप dragons-descendants से TUPLE: child < parent … पहले ही जानते हैं। यह एक ही मूल क्लास वाला पदानुक्रम है, जिसमें स्लॉट नीचे की ओर आते हैं। Factor में क्लास ग्राफ़ बढ़ाने का दूसरा तरीका भी है: ओपन मिक्सिन। MIXIN: m बिना किसी स्लॉट वाली एक क्लास घोषित करता है; बाद में दूसरी क्लासें INSTANCE: c m लिखकर उसमें शामिल हो सकती हैं। सदस्यता कई-से-कई होती है: एक क्लास जितने चाहे मिक्सिन की इंस्टेंस बन सकती है।

स्ट्रीम प्रोटोकॉल दो मिक्सिन इस्तेमाल करता है, ताकि पता चले कि कोई क्लास इंटरफ़ेस का कौन-सा आधा हिस्सा लागू करती है:

INSTANCE: my-stream input-stream    ! readable
INSTANCE: my-stream output-stream   ! writable

एक स्ट्रीम इनमें से एक हो सकती है, दूसरी हो सकती है, या दोनों। फिर input-stream (या output-stream) पर बने जेनेरिक मेथड उस हर क्लास पर लागू हो जाते हैं जो उस मिक्सिन से जुड़ी है। इसी तरह आसपास उपलब्ध read1, stream-contents, with-input-stream जैसे शब्द आपकी क्लास तक पहुँचते हैं।

मिक्सिन ओपन होते हैं: किसी मिक्सिन के घोषित हो जाने के बाद भी आप उसमें नया सदस्य जोड़ सकते हैं, चाहे वह किसी और वोकैबुलरी में हो। इसके उलट TUPLE: < parent है, जहाँ यह संबंध तभी तय हो जाता है जब चाइल्ड क्लास घोषित की जाती है।

प्रोटोकॉल के जेनेरिक

प्रोटोकॉल के जेनेरिक io में रहते हैं:

stream-read1         ( stream -- elt/f )
stream-read          ( n stream -- seq/f )
stream-read-unsafe   ( n buf stream -- count )
stream-write1        ( elt stream -- )
stream-write         ( seq stream -- )
stream-flush         ( stream -- )
stream-element-type  ( stream -- type )

stream-read1 अगला बाइट लौटाता है (या स्ट्रीम के अंत में f), और stream-write1 एक बाइट लिखता है। stream-read-unsafe निचले स्तर का बैच रीड है, जो ज़्यादातर इनपुट स्ट्रीम देती हैं; stream-read इसी के ऊपर बना है और आवंटन का काम संभालता है। stream-element-type बताता है कि स्ट्रीम बाइट (+byte+) में काम करती है या अक्षर (+character+) में; जब आप किसी दूसरी स्ट्रीम को लपेटते हैं, तो सबसे आसान कार्यान्वयन बस नीचे वाली स्ट्रीम को ही काम सौंप देता है।

क्लीनअप destructors से आता है

स्ट्रीम disposable होती हैं: एक कस्टम स्ट्रीम disposable को एक्सटेंड करती है और dispose* लागू करती है। यही फ्रेमवर्क boatswains-bilge से आता है, जिसे यहाँ एक स्ट्रीम क्लास पर लगाया गया है:

TUPLE: my-stream < disposable underlying ;

: <my-stream> ( underlying -- s )
    my-stream new-disposable swap >>underlying ;

M: my-stream dispose* underlying>> dispose ;

यह सब हो जाने के बाद, channel-chatter से आने वाले सारे with-… कॉम्बिनेटर आपकी स्ट्रीम पर अपने आप काम करने लगते हैं।

निर्देश

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

आपको टेप को Factor का एक कस्टम इनपुट स्ट्रीम बनाना है।

1. टेप बनाइए

एक tape टपल बनाइए जो disposable को विस्तारित करता है और जिसमें अंतर्निहित इनपुट स्ट्रीम के लिए एक स्लॉट, wire, होता है।

TUPLE: tape < disposable wire ;

इसके बाद कंस्ट्रक्टर <tape> ( wire -- tape ) लिखिए। new के बजाय new-disposable इस्तेमाल कीजिए, ताकि डिस्ट्रक्टर फ्रेमवर्क टेप को रजिस्टर कर ले। अंतर्निहित स्ट्रीम को wire स्लॉट में रखिए।

2. इनपुट-स्ट्रीम मिक्सिन से जुड़िए

tape को input-stream घोषित कीजिए:

INSTANCE: tape input-stream

इससे प्रोटोकॉल के डिफॉल्ट कॉम्बिनेटर आपकी क्लास पर ही लागू होते हैं।

3. एक मोर्स प्रतीक पढ़िए

M: tape stream-read1 ( tape -- elt/f ) लागू कीजिए। अंतर्निहित वायर से बाइट पढ़ते जाइए, जब तक कि CHAR: ., CHAR: - या CHAR: \s (स्पेस) में से कोई एक न मिल जाए। उस बाइट को लौटाइए। अगर वायर f लौटाता है (स्ट्रीम का अंत), तो आप भी f लौटाइए। अब टेप का काम पूरा हो गया।

"x.y -ab cz" <string-reader> <tape>
[ stream-read1 ] [ stream-read1 ] [ stream-read1 ] tri
! => CHAR: . CHAR: - CHAR: \s

4. एलिमेंट टाइप सौंपिए

M: tape stream-element-type ( tape -- type ) लागू कीजिए और यह काम वायर को सौंप दीजिए। टेप इस बात को नहीं बदलता कि किस तरह के एलिमेंट पढ़े जा रहे हैं।

5. सफाई कीजिए

M: tape dispose* ( tape -- ) लागू कीजिए। फ्रेमवर्क हर dispose पर आपके मेथड को ठीक एक बार कॉल करता है। आपको बस अंतर्निहित वायर को डिस्पोज़ करना है।

ये पाँचों चीज़ें तैयार हो जाने पर टेप एक सामान्य इनपुट स्ट्रीम की तरह काम करता है। with-input-stream, stream-read और प्रोटोकॉल के बाकी शब्द अपने आप आपके मेथड पर लागू होते हैं।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Factor Exercism

टेलीग्राफर का टेप शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।