- প্রকাশিত
র্যাকেটে ফাংশনাল প্রোগ্রামিং | ভিডিও এবং গিটহাব সহ স্কিমা প্রোগ্রামিং পার্ট ২
- লেখক
- লেখক
- নাম
- মো: নাসিম শেখ
- টুইটার
- টুইটার
- @nasimStg
ফাংশনাল প্রোগ্রামিং (FP) কী?
ফাংশনাল প্রোগ্রামিং হলো একটি প্রোগ্রামিং প্যারাডাইম যা গণনাকে গাণিতিক ফাংশনের মূল্যায়ন হিসাবে গণ্য করে। FP-তে, ফাংশনগুলি ফার্স্ট-ক্লাস সিটিজেন—অর্থাৎ, সেগুলিকে আর্গুমেন্ট হিসাবে পাস করা যেতে পারে, অন্যান্য ফাংশন থেকে রিটার্ন করা যেতে পারে এবং ভেরিয়েবলে অ্যাসাইন করা যেতে পারে। অন্যান্য প্যারাডাইমের বিপরীতে, FP কীভাবে করতে হবে তার চেয়ে কী করতে হবে তার উপর জোর দেয়, যা এটিকে আরও ডিক্লারেটিভ পদ্ধতি করে তোলে।
র্যাকেটে, FP বিশেষ স্থান পায় কারণ ভাষাটি মার্জিতভাবে এবং দক্ষতার সাথে সমস্যা সমাধানের জন্য ফাংশন ব্যবহারের ধারণার উপর ভিত্তি করে তৈরি।
- বিশুদ্ধ ফাংশন: এই ফাংশনগুলি একই ইনপুট দেওয়া হলে সর্বদা একই আউটপুট তৈরি করে এবং তাদের কোনো সাইড ইফেক্ট থাকে না।
- অপরিবর্তনীয়তা (Immutability): ফাংশনাল প্রোগ্রামিংয়ে ডেটা অপরিবর্তনীয়, যার অর্থ একবার তৈরি হওয়ার পরে এটি পরিবর্তন করা যায় না।
- রিকার্সন: লুপ ব্যবহার করার পরিবর্তে, FP প্রায়শই সমস্যা সমাধানের জন্য রিকার্সনের উপর নির্ভর করে।
- ফার্স্ট-ক্লাস ফাংশন: র্যাকেটে ফাংশনগুলিকে আর্গুমেন্ট হিসাবে পাস করা যেতে পারে, অন্যান্য ফাংশন থেকে রিটার্ন করা যেতে পারে এবং ভেরিয়েবলে সংরক্ষণ করা যেতে পারে, যা উচ্চ-ক্রম ফাংশন সক্ষম করে।
বিশুদ্ধ ফাংশন এবং অপরিবর্তনীয়তা
র্যাকেটে (এবং সাধারণভাবে FP-তে), একটি বিশুদ্ধ ফাংশন হলো সেটি যা:
১. একই ইনপুট দেওয়া হলে সর্বদা একই ফলাফল তৈরি করে। ২. এর কোনো সাইড ইফেক্ট নেই (অর্থাৎ, এটি বাহ্যিক ভেরিয়েবল বা ডেটা স্ট্রাকচার পরিবর্তন করে না)। এখানে র্যাকেটে একটি বিশুদ্ধ ফাংশনের উদাহরণ দেওয়া হলো যা একটি সংখ্যার বর্গ গণনা করে:
(define (square x)
(* x x))
বিশুদ্ধ ফাংশনগুলি কোডকে অনুমানযোগ্য এবং ডিবাগ করা সহজ করতে সহায়তা করে। যখন ফাংশনগুলির কোনো সাইড ইফেক্ট থাকে না, তখন আপনার প্রোগ্রামের অন্য কোথাও অপ্রত্যাশিত পরিবর্তন সম্পর্কে আপনাকে চিন্তা করতে হবে না।
র্যাকেটে অপরিবর্তনীয়তা র্যাকেটে অপরিবর্তনীয়তা একটি মূল বৈশিষ্ট্য। একবার একটি ভেরিয়েবল বা ডেটা স্ট্রাকচার সংজ্ঞায়িত হলে, এটি পরিবর্তন করা যায় না। এটি আপনার প্রোগ্রাম জুড়ে ধারাবাহিকতা বজায় রাখতে সহায়তা করে।
(define x 10)
এই উদাহরণে, x অপরিবর্তনীয় এবং একবার সংজ্ঞায়িত হলে এটি পরিবর্তন করা যায় না। আপনার যদি একটি নতুন মানের প্রয়োজন হয়, আপনি মূলটিকে পরিবর্তন না করে একটি নতুন ভেরিয়েবল বা ফাংশন তৈরি করেন।
র্যাকেটে ভেরিয়েবল এবং কনস্ট্যান্ট র্যাকেটে, আমরা define ব্যবহার করে ভেরিয়েবল সংজ্ঞায়িত করি, তবে এই ভেরিয়েবলগুলি মূলত কনস্ট্যান্ট কারণ তাদের প্রাথমিক সংজ্ঞার পরে পুনরায় অ্যাসাইন করা যায় না। এটি আমরা আগে উল্লিখিত অপরিবর্তনীয়তা ধারণাটিকে শক্তিশালী করে।
(define my-var 42)
পরিবর্তনযোগ্য ডেটা নিয়ে কাজ করার জন্য, র্যাকেট set!-এর মতো কনস্ট্রাক্ট সরবরাহ করে, তবে স্পষ্টতা এবং নির্ভরযোগ্যতার জন্য অপরিবর্তনীয়তাকে আলিঙ্গন করার পক্ষে এগুলি সাধারণত নিরুৎসাহিত করা হয়।
ফাংশন সংজ্ঞা এবং রিকার্সনের মৌলিক বিষয় define কিওয়ার্ড ব্যবহার করে র্যাকেটে ফাংশন সংজ্ঞায়িত করা সহজ। রিকার্সন, একটি মূল FP ধারণা, একটি ফাংশনকে একটি সমস্যার ছোট ছোট উদাহরণ সমাধানের জন্য নিজেকে কল করার অনুমতি দেয়। FP-তে, রিকার্সন প্রায়শই ইটারেশনের পদ্ধতি হিসাবে লুপ প্রতিস্থাপন করে।
এখানে একটি সাধারণ রিকার্সিভ ফাংশনের উদাহরণ দেওয়া হলো যা একটি সংখ্যার ফ্যাক্টরিয়াল গণনা করে:
(define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
এই ফাংশনটি প্রদর্শন করে যে কীভাবে রিকার্সন র্যাকেটে ঐতিহ্যবাহী লুপিং প্রতিস্থাপন করতে পারে, যা সমস্যাগুলিকে ছোট, সরল অংশে ভেঙে সমাধান করার FP নীতিগুলি মেনে চলে।
ফার্স্ট-ক্লাস ফাংশন র্যাকেটের সবচেয়ে শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে একটি হলো এটি ফাংশনগুলিকে ফার্স্ট-ক্লাস সিটিজেন হিসাবে বিবেচনা করে। এর মানে হলো ফাংশনগুলি নিম্নলিখিতভাবে ব্যবহার করা যেতে পারে:
অন্য ফাংশনে আর্গুমেন্ট হিসাবে পাস করা। অন্য ফাংশন থেকে রিটার্ন করা। ভেরিয়েবলে অ্যাসাইন করা। এটি আপনাকে আরও মডুলার, পুনঃব্যবহারযোগ্য কোড লিখতে সাহায্য করে। উদাহরণস্বরূপ, এখানে একটি উচ্চ-ক্রম ফাংশন দেওয়া হলো যা অন্য একটি ফাংশনকে আর্গুমেন্ট হিসাবে নেয়:
(define (apply-twice f x)
(f (f x)))
এই উদাহরণে, apply-twice ফাংশনটি একটি ফাংশন f নেয় এবং এটিকে আর্গুমেন্ট x-এর উপর দুবার প্রয়োগ করে।
সবকিছু একসাথে করা ফাংশনাল প্রোগ্রামিং র্যাকেটের কেন্দ্রবিন্দুতে রয়েছে এবং এর মূল নীতিগুলি বোঝা আপনাকে আরও কার্যকর এবং মার্জিত কোড লিখতে সহায়তা করবে। বিশুদ্ধ ফাংশন, অপরিবর্তনীয়তা, রিকার্সন এবং ফার্স্ট-ক্লাস ফাংশনগুলি র্যাকেট ভাষা আয়ত্ত করার অবিচ্ছেদ্য অংশ।
পরবর্তী পোস্টে, আমরা উচ্চ-ক্রম ফাংশন এবং ক্লোজারগুলির মধ্যে ডুব দিয়ে এই ধারণাগুলি কীভাবে আরও এগিয়ে নেওয়া যায় তা অন্বেষণ করব। কোড উদাহরণ এবং অনুশীলন অনুশীলনের জন্য সহায়ক ভিডিও টিউটোরিয়াল এবং গিটহাব রিপোজিটরি দেখতে ভুলবেন না!
এরপর কী? আপনি যদি অনুসরণ করেন, তবে নিম্নলিখিতগুলি করতে ভুলবেন না:
এই পোস্টে লিঙ্ক করা ভিডিও টিউটোরিয়ালটি দেখুন। আমাদের গিটহাব রিপোজিটরি [লিঙ্ক] থেকে কোড উদাহরণগুলি ক্লোন করুন। পোস্টের শেষে দেওয়া অনুশীলন অনুশীলনগুলি চেষ্টা করুন। পরবর্তী পোস্টের জন্য সাথে থাকুন, যেখানে আমরা র্যাকেটে আপনার ফাংশনাল প্রোগ্রামিংয়ের ভিত্তি তৈরি চালিয়ে যাব!