Erlang-এ Pattern Matching এর ব্যবহার
Pattern matching হল Erlang এর একটি শক্তিশালী বৈশিষ্ট্য, যা ফাংশন, মেসেজ পাসিং, এবং ডেটা স্ট্রাকচারগুলোকে খুব সহজে মেলানোর এবং নির্ধারণ করার জন্য ব্যবহৃত হয়। এটি ভাষার মূল শক্তি এবং এক্সপ্রেশনগুলোর মধ্যে ব্যবহার করা হয় যেখানে কোডের কার্যকারিতা নির্ধারণ করতে সাহায্য করে।
Pattern matching মূলত ডেটার গঠন এবং এর ধরন অনুযায়ী কাজ করে। Erlang-এ pattern matching ব্যাপকভাবে ব্যবহৃত হয় এবং এর মাধ্যমে কোডের নির্ভুলতা এবং কার্যকারিতা অনেক বাড়ানো যায়।
1. Function Clauses (ফাংশন ক্লজে Pattern Matching)
Erlang-এ pattern matching সবচেয়ে বেশি ব্যবহৃত হয় ফাংশন ক্লজগুলিতে। যখন একটি ফাংশন কল করা হয়, তখন Erlang মেট্রিক্যালি প্যাটার্নগুলো মিলিয়ে সঠিক ক্লজটি নির্বাচন করে। এতে কোডটি আরও সহজ, পরিষ্কার এবং কার্যকর হয়।
উদাহরণ:
-module(pattern_example).
-export([check_number/1]).
check_number(0) ->
io:format("Zero~n");
check_number(X) when X > 0 ->
io:format("Positive number: ~p~n", [X]);
check_number(X) when X < 0 ->
io:format("Negative number: ~p~n", [X]).এখানে, check_number/1 ফাংশনটি তিনটি ভিন্ন ক্লজ ব্যবহার করছে যা প্যাটার্ন মাচিংয়ের মাধ্যমে ইনপুট অনুসারে বিভিন্ন কাজ করবে:
- প্রথম ক্লজটি ইনপুট
0মিলিয়ে"Zero"আউটপুট করবে। - দ্বিতীয় ক্লজটি ইনপুট যদি ধনাত্মক হয়, তাহলে
"Positive number"আউটপুট করবে। - তৃতীয় ক্লজটি ইনপুট যদি ঋণাত্মক হয়, তাহলে
"Negative number"আউটপুট করবে।
Pattern matching এর মাধ্যমে প্রতিটি ইনপুট অনুযায়ী সঠিক ক্লজ নির্বাচন করা হয়।
2. List Matching (লিস্টে Pattern Matching)
Erlang-এ প্যাটার্ন মাচিংকে ব্যবহার করে লিস্টের উপাদানগুলোকে সহজেই এক্সেস করা যায়। লিস্টের প্রথম উপাদান বা বাকি উপাদানগুলো নিয়ে কাজ করা সম্ভব।
উদাহরণ:
-module(list_example).
-export([head_and_tail/1]).
head_and_tail([Head | Tail]) ->
io:format("Head: ~p, Tail: ~p~n", [Head, Tail]);
head_and_tail([]) ->
io:format("Empty list~n").এখানে, head_and_tail/1 ফাংশনটি একটি লিস্টের প্রথম উপাদান (Head) এবং বাকি অংশ (Tail) মেলাচ্ছে।
- প্রথম ক্লজে, এটি একটি প্যাটার্ন মাচ করে লিস্টের প্রথম উপাদান এবং বাকি অংশ বের করে আনে।
- দ্বিতীয় ক্লজটি একটি খালি লিস্টের জন্য আউটপুট দেয়।
এইভাবে লিস্টের উপাদানগুলো খুব সহজে এক্সেস করা যায়।
3. Tuple Matching (টুপল প্যাটার্ন মাচিং)
Erlang-এ tuple গঠনেও প্যাটার্ন মাচিং ব্যবহার করা হয়। টুপল থেকে নির্দিষ্ট উপাদানগুলি বের করার জন্য এটি খুব কার্যকরী।
উদাহরণ:
-module(tuple_example).
-export([extract/1]).
extract({ok, Result}) ->
io:format("Operation successful, result: ~p~n", [Result]);
extract({error, Reason}) ->
io:format("Error occurred, reason: ~p~n", [Reason]).এখানে, extract/1 ফাংশনটি দুটি ভিন্ন টুপলের সাথে কাজ করছে:
- প্রথম ক্লজে এটি
{ok, Result}টুপল মেলাবে এবংResultআউটপুট করবে। - দ্বিতীয় ক্লজে এটি
{error, Reason}টুপল মেলাবে এবং ত্রুটির কারণ প্রদর্শন করবে।
এভাবে টুপলগুলোর মধ্যে নির্দিষ্ট মান বের করা হয়।
4. Pattern Matching in Recursion (প্যাটার্ন মাচিং রিকার্সনে)
Erlang-এ রিকার্সন ব্যবহার করা হয় এবং প্যাটার্ন মাচিং এটি সহজতর করে তোলে। একটি সাধারণ উদাহরণ হল লিস্টের উপাদানগুলিকে পুনরাবৃত্তি করে এক্সেস করা।
উদাহরণ:
-module(recursion_example).
-export([sum/1]).
sum([Head | Tail]) ->
Head + sum(Tail);
sum([]) ->
0.এখানে, sum/1 ফাংশনটি একটি লিস্টের সকল উপাদানের যোগফল বের করতে রিকার্সন ব্যবহার করছে। প্রথম ক্লজটি লিস্টের প্রথম উপাদান এবং বাকি অংশের মধ্যে প্যাটার্ন মাচিং করছে। দ্বিতীয় ক্লজটি খালি লিস্টের জন্য একটি বেস কেস।
5. Matching in Receive Block (রিসিভ ব্লকে প্যাটার্ন মাচিং)
Erlang এর receive ব্লকেও প্যাটার্ন মাচিং ব্যবহৃত হয়, যেখানে একটি প্রক্রিয়া মেসেজ গ্রহণ করে এবং সেগুলোর উপর নির্ভর করে সিদ্ধান্ত নেয়।
উদাহরণ:
-module(process_example).
-export([start/0, loop/0]).
start() ->
spawn(fun loop/0).
loop() ->
receive
{hello, Name} -> io:format("Hello, ~p!~n", [Name]);
{bye, Name} -> io:format("Goodbye, ~p!~n", [Name]);
_ -> io:format("Unknown message~n")
end,
loop().এখানে, loop/0 ফাংশনে receive ব্লকে তিনটি প্যাটার্ন আছে:
{hello, Name}: যদি{hello, Name}মেসেজ পাওয়া যায়, তাহলে তা আউটপুট করবে।{bye, Name}: যদি{bye, Name}মেসেজ পাওয়া যায়, তাহলে তা আউটপুট করবে।_: অন্য কোন মেসেজ হলেUnknown messageআউটপুট করবে।
এভাবে মেসেজ প্যাটার্ন মাচিংয়ের মাধ্যমে একাধিক ধরনের মেসেজ প্রক্রিয়া করা হয়।
উপসংহার
Erlang-এ pattern matching একটি অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডের কার্যকারিতা এবং সহজতা বৃদ্ধি করে। এটি ফাংশন, টুপল, লিস্ট, মেসেজ পাসিং এবং রিকার্সনের মতো বিভিন্ন ক্ষেত্রে ব্যবহার করা যায়। এর মাধ্যমে কোড কম্প্যাক্ট, পাঠযোগ্য এবং কার্যকরী হয়, যা একটি ফাংশনাল প্রোগ্রামিং ভাষার অন্যতম শক্তি।
Read more