ট্র্যাক
/
Factor
Factor
/
অনুশীলনী
/
টেলিগ্রাফারের টেপ
টেলিগ্রাফারের টেপ

টেলিগ্রাফারের টেপ

লার্নিং অনুশীলনী

ভূমিকা

আপনি channel-chatter-এ স্ট্রিম ব্যবহার করে ফেলেছেন এবং boatswains-bilge-এ সেগুলো ডিসপোজ করে ফেলেছেন। এই অনুশীলনীটি আপনার প্রথম কাস্টম স্ট্রিম, অর্থাৎ এমন একটি ক্লাস যা প্রোটোকল ইমপ্লিমেন্ট করে, যাতে 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 এক্সটেন্ড করে এবং 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. input-stream মিক্সিনে যুক্ত হোন

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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।