কার্গো শাফল-এ আপনি 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 কনস্ট্যান্টটি ডিফাইন করুন, যেটি রিটার্ন করবে ওভেনে লাসাগনাটি বেক হতে কত মিনিট লাগবে।
রান্নার বই অনুযায়ী, লাসাগনাকে ওভেনে মোট ৪০ মিনিট থাকতে হবে।
expected-bake-time .
! => 40
preparation-time ওয়ার্ডটি ডিফাইন করুন। এটি স্ট্যাক থেকে লাসাগনায় আপনি যতগুলো স্তর যোগ করেছেন তার সংখ্যা নেয় এবং প্রস্তুত করতে আপনার কত মিনিট লেগেছে তা রেখে দেয়, ধরে নিয়ে যে প্রতিটি স্তর প্রস্তুত করতে ২ মিনিট লাগে।
4 preparation-time .
! => 8
remaining-time ওয়ার্ডটি ডিফাইন করুন। এটি লাসাগনা ইতিমধ্যে ওভেনে যত মিনিট কাটিয়েছে তার সংখ্যা নেয় এবং সেখানে আরও কত মিনিট থাকতে হবে তা রেখে দেয়।
25 remaining-time .
! => 15
total-working-time ওয়ার্ডটি ডিফাইন করুন। এটি স্ট্যাক থেকে দুটি আর্গুমেন্ট নেয়, প্রথমে লাসাগনার স্তরের সংখ্যা, তারপর লাসাগনা ইতিমধ্যে ওভেনে যত মিনিট ছিল তার সংখ্যা, এবং এখন পর্যন্ত রান্নায় ব্যয় হওয়া মোট সময় রেখে দেয়: প্রস্তুতির সময় যোগ ওভেনে ইতিমধ্যে কাটানো সময়।
3 20 total-working-time .
! => 26
Exercism-এ সাইন আপ করুন, Factor ট্র্যাকের 47টি কনসেপ্ট163টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।