নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টস (Control Flow Statements) in Elixir
Elixir তে নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টস (Control Flow Statements) ব্যবহৃত হয় কোডের গতিবিধি নির্ধারণ করতে, যেমন শর্ত যাচাই করা, লুপ চালানো, বা কোডের কার্যক্রম নিয়ন্ত্রণ করা। Elixir এর নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টস সাধারণত if, unless, case, cond, এবং receive কিওয়ার্ডগুলো দ্বারা পরিচালিত হয়। এই স্টেটমেন্টগুলির মাধ্যমে আমরা কোডের শর্ত এবং লজিক নিয়ন্ত্রণ করতে পারি।
এখানে Elixir তে ব্যবহৃত মূল নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টগুলির আলোচনা করা হলো।
১. if-else স্টেটমেন্ট (if-else statement)
if এবং else স্টেটমেন্ট ব্যবহার করে আমরা শর্ত যাচাই করে কোডের কার্যক্রম নিয়ন্ত্রণ করতে পারি। Elixir তে if শর্ত অনুযায়ী একটি ব্লক চালাতে ব্যবহৃত হয় এবং else অন্য শর্তে কাজ করতে ব্যবহৃত হয়।
উদাহরণ:
x = 10
y = 5
if x > y do
IO.puts("x বড় y এর চেয়ে")
else
IO.puts("y বড় x এর চেয়ে")
endএখানে, যদি x এর মান y এর চেয়ে বড় হয়, তাহলে "x বড় y এর চেয়ে" প্রিন্ট হবে, নাহলে "y বড় x এর চেয়ে" প্রিন্ট হবে।
২. unless স্টেটমেন্ট (unless statement)
unless স্টেটমেন্টটি if এর বিপরীত কাজ করে। অর্থাৎ, যদি শর্তটি মিথ্যা হয়, তাহলে কোডের ব্লকটি চালানো হয়।
উদাহরণ:
x = 10
y = 5
unless x <= y do
IO.puts("x বড় y এর চেয়ে")
else
IO.puts("x ছোট বা সমান y এর সাথে")
endএখানে, unless x <= y শর্তটি মিথ্যা হলে "x বড় y এর চেয়ে" প্রিন্ট হবে।
৩. case স্টেটমেন্ট (case statement)
case স্টেটমেন্টটি একটি ভেরিয়েবল বা এক্সপ্রেশন এর মানের ভিত্তিতে বিভিন্ন কন্ডিশন চেক করে। এটি প্যাটার্ন ম্যাচিং এর উপর ভিত্তি করে কাজ করে এবং কোডের বিভিন্ন ফলাফল নির্ধারণ করতে ব্যবহৃত হয়।
উদাহরণ:
x = :ok
case x do
:ok -> IO.puts("সফল")
:error -> IO.puts("ত্রুটি")
_ -> IO.puts("অপরিচিত")
endএখানে, x এর মান যদি :ok হয়, তাহলে "সফল" প্রিন্ট হবে, যদি x এর মান :error হয়, তাহলে "ত্রুটি" প্রিন্ট হবে। _ হচ্ছে ডিফল্ট প্যাটার্ন, যা অন্যান্য মানের জন্য ব্যবহৃত হয়।
৪. cond স্টেটমেন্ট (cond statement)
cond একটি বহুল ব্যবহৃত নিয়ন্ত্রণ প্রবাহ স্টেটমেন্ট, যা একাধিক শর্ত যাচাই করে এবং যেকোনো একটি শর্ত মিলে গেলে সংশ্লিষ্ট ব্লকটি চালায়। এটি else if স্টেটমেন্টের মতো কাজ করে।
উদাহরণ:
x = 10
cond do
x > 5 -> IO.puts("x বড় 5 এর চেয়ে")
x == 5 -> IO.puts("x সমান 5 এর")
true -> IO.puts("অন্য শর্ত") # ডিফল্ট কন্ডিশন
endএখানে cond একের পর এক শর্ত পরীক্ষা করে এবং প্রথম মিলে যাওয়া শর্তের ব্লকটি চালাবে। true -> IO.puts("অন্য শর্ত") হলো ডিফল্ট শর্ত, যা অন্যান্য সব শর্তে চালানো হবে।
৫. receive স্টেটমেন্ট (receive statement)
receive স্টেটমেন্টটি Elixir তে অ্যাসিঙ্ক্রোনাস মেসেজ পাসিং এর জন্য ব্যবহৃত হয়। এটি প্রক্রিয়া (process) থেকে মেসেজ গ্রহণ করতে ব্যবহৃত হয় এবং মেসেজের ভিত্তিতে শর্ত গ্রহণ করে।
উদাহরণ:
defmodule MyModule do
def example do
send(self(), :hello) # নিজেই নিজে একটি মেসেজ পাঠাচ্ছে
receive do
:hello -> IO.puts("মেসেজ পাওয়া গেছে!")
end
end
end
MyModule.example() # "মেসেজ পাওয়া গেছে!"এখানে, receive ব্লকটি মেসেজ পেলে তা প্রক্রিয়া করবে। self() হচ্ছে বর্তমান প্রক্রিয়ার জন্য একটি রেফারেন্স।
৬. try-catch/throw-catch (ব্যতিক্রম হ্যান্ডলিং)
Elixir তে ব্যতিক্রম বা এর্সর হ্যান্ডলিং করতে try, catch, throw এবং catch ব্যবহৃত হয়। এই স্টেটমেন্টগুলো ব্যতিক্রম সৃষ্টির আগে সতর্ক থাকে এবং তাকে ধরার জন্য ব্যবহৃত হয়।
উদাহরণ (try-catch):
try do
# কিছু কোড যা ব্যতিক্রম সৃষ্টি করতে পারে
raise "এটি একটি ত্রুটি"
rescue
exception -> IO.puts("ত্রুটি: #{exception.message}")
endএখানে raise ত্রুটি সৃষ্টি করবে, এবং rescue ব্লকটি সেই ত্রুটিটিকে ধরবে এবং "ত্রুটি" বার্তা প্রিন্ট করবে।
সারসংক্ষেপ
Elixir তে নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টগুলি (Control Flow Statements) কোডের কার্যক্রম নিয়ন্ত্রণ করতে সহায়ক। এগুলি ব্যবহৃত হয় শর্ত যাচাই করার জন্য, লজিক প্রয়োগ করার জন্য এবং মেসেজ পাসিংয়ের মাধ্যমে প্রসেসগুলির মধ্যে যোগাযোগ করার জন্য। Elixir তে ব্যবহৃত কিছু গুরুত্বপূর্ণ নিয়ন্ত্রণ প্রবাহ স্টেটমেন্টের মধ্যে রয়েছে:
- if এবং unless: শর্ত যাচাই করে কাজ করে।
- case: এক্সপ্রেশন বা ভেরিয়েবলের উপর ভিত্তি করে শর্ত নির্ধারণ করে।
- cond: একাধিক শর্তের মধ্যে কোন একটি শর্ত মেলে কিনা চেক করে।
- receive: অ্যাসিঙ্ক্রোনাস মেসেজ পাসিংয়ের জন্য ব্যবহৃত হয়।
- try-catch/throw-catch: ব্যতিক্রম হ্যান্ডলিং (exception handling) এর জন্য ব্যবহৃত হয়।
এই স্টেটমেন্টগুলির মাধ্যমে আপনি কোডের প্রবাহকে কার্যকরভাবে নিয়ন্ত্রণ করতে পারবেন এবং আপনার অ্যাপ্লিকেশনকে আরো গতিশীল এবং কার্যকরী করতে পারবেন।
Elixir: if, unless, এবং case স্টেটমেন্ট
Elixir তে কন্ডিশনাল স্টেটমেন্টগুলির মধ্যে if, unless, এবং case খুবই গুরুত্বপূর্ণ, এবং এগুলোর মাধ্যমে শর্তাধীন লজিক নির্ধারণ করা হয়। এগুলি Elixir তে কন্ডিশনাল লজিক তৈরি করতে ব্যবহৃত হয় এবং আপনাকে কোডের নির্দিষ্ট অংশগুলো সুনির্দিষ্ট শর্ত অনুযায়ী কার্যকরী করতে সাহায্য করে।
1. if স্টেটমেন্ট
if স্টেটমেন্ট হল সবচেয়ে সাধারণ কন্ডিশনাল স্টেটমেন্ট। এটি একটি শর্ত পরীক্ষা করে এবং সেই শর্তটি সত্য (true) হলে একটি ব্লক চালায়, আর মিথ্যা (false) হলে অন্য একটি ব্লক চালায়।
সিনট্যাক্স:
if <condition> do # condition সত্য হলে যা হবে else # condition মিথ্যা হলে যা হবে endউদাহরণ:
x = 5 if x > 3 do IO.puts("x is greater than 3") else IO.puts("x is less than or equal to 3") end
এখানে, x এর মান ৫ হওয়ায় শর্তটি সত্য, তাই আউটপুট হবে x is greater than 3।
ফলাফল:
x is greater than 3
2. unless স্টেটমেন্ট
unless স্টেটমেন্ট if স্টেটমেন্টের বিপরীত। অর্থাৎ, unless যখন শর্ত মিথ্যা হয়, তখন কোডের ব্লকটি চালায়। unless সাধারণত শর্তটি যদি মিথ্যা (false) হয় তবেই কাজ করে।
সিনট্যাক্স:
unless <condition> do # condition মিথ্যা হলে যা হবে else # condition সত্য হলে যা হবে endউদাহরণ:
x = 2 unless x > 3 do IO.puts("x is not greater than 3") else IO.puts("x is greater than 3") end
এখানে, x এর মান ২ হওয়ায় শর্তটি মিথ্যা, তাই আউটপুট হবে x is not greater than 3।
ফলাফল:
x is not greater than 3
3. case স্টেটমেন্ট
case স্টেটমেন্ট Elixir তে একটি শক্তিশালী কন্ডিশনাল স্টেটমেন্ট, যা বিভিন্ন প্যাটার্নের সাথে মানগুলির তুলনা করতে ব্যবহৃত হয়। এটি প্যাটার্ন ম্যাচিংয়ের উপর ভিত্তি করে কাজ করে। case ব্যবহার করে আপনি একাধিক সম্ভাবনা পরীক্ষা করতে পারেন।
সিনট্যাক্স:
case <expression> do <pattern1> -> <code block1> <pattern2> -> <code block2> _ -> <code block for default case> endউদাহরণ:
x = 3 case x do 1 -> IO.puts("x is 1") 2 -> IO.puts("x is 2") 3 -> IO.puts("x is 3") _ -> IO.puts("x is some other value") end
এখানে, x এর মান 3 হওয়ায়, তৃতীয় প্যাটার্নটি মিলে যাবে এবং আউটপুট হবে x is 3।
ফলাফল:
x is 3ডিফল্ট কেস:
_(underscore) ব্যবহার করা হয় ডিফল্ট প্যাটার্ন হিসেবে, যেখানে কোনও প্যাটার্ন মেলানো না গেলে সেটি কাজ করবে।x = 10 case x do 1 -> IO.puts("x is 1") 2 -> IO.puts("x is 2") _ -> IO.puts("x is something else") endএখানে,
xএর মান10হওয়ায়_প্যাটার্নটি কার্যকরী হবে এবং আউটপুট হবেx is something else।
সারসংক্ষেপ
if: একটি শর্ত পরীক্ষা করে এবং সত্য হলে একটি ব্লক চালায়, মিথ্যা হলে অন্য একটি ব্লক চালায়।unless: এটিifএর বিপরীত। শর্ত মিথ্যা হলে কোডের ব্লকটি চালায়।case: একাধিক প্যাটার্নের মধ্যে মিল খুঁজে ফেলে এবং প্যাটার্ন ম্যাচিংয়ের মাধ্যমে কাজ করে। এটি অনেক বেশি শক্তিশালী, কারণ আপনি একাধিক শর্ত এবং প্যাটার্ন পরীক্ষা করতে পারেন।
এই কন্ডিশনাল স্টেটমেন্টগুলি Elixir তে আপনার কোডের লজিকাল স্ট্রাকচার তৈরি করতে সাহায্য করে এবং ভিন্ন ভিন্ন পরিস্থিতিতে কার্যকরী কোড পরিচালনা করতে সক্ষম করে।
cond, with, এবং try এর ব্যবহার Elixir তে
Elixir একটি ফাংশনাল প্রোগ্রামিং ভাষা, এবং এতে রয়েছে কিছু বিশেষ কন্ট্রোল ফ্লো স্টেটমেন্ট, যেগুলির মধ্যে cond, with, এবং try খুবই গুরুত্বপূর্ণ। এই তিনটি স্টেটমেন্ট ব্যবহারের মাধ্যমে আপনি কন্ডিশনাল লজিক, প্যাটার্ন ম্যাচিং এবং এরর হ্যান্ডলিং খুব সহজভাবে করতে পারবেন। চলুন, এই তিনটি স্টেটমেন্টের ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করি।
১. cond (Conditional)
cond হল Elixir এর একটি কন্ডিশনাল কন্ট্রোল স্টেটমেন্ট, যা একাধিক শর্ত যাচাই করতে ব্যবহৃত হয়। এটি if বা case স্টেটমেন্টের তুলনায় আরও সুবিধাজনক, কারণ আপনি একাধিক শর্ত পরীক্ষা করতে পারেন এবং প্রতিটি শর্তের জন্য একটি আউটপুট নির্ধারণ করতে পারেন।
বৈশিষ্ট্য:
condএকাধিক শর্ত চেক করার জন্য ব্যবহৃত হয়।- এটি
trueমেলা শর্তের জন্য কার্যকর কোড ব্লক চালায়। condএর মধ্যে যদি কোন শর্ত মেলেনা, তাহলে একটিelseব্লকও থাকতে পারে।
ব্যবহার:
cond do
x > 0 -> IO.puts("Positive")
x < 0 -> IO.puts("Negative")
x == 0 -> IO.puts("Zero")
true -> IO.puts("Default case")
endউদাহরণ:
x = 5
cond do
x > 0 -> IO.puts("x is positive")
x < 0 -> IO.puts("x is negative")
x == 0 -> IO.puts("x is zero")
true -> IO.puts("This will never happen")
endএখানে, cond এর মধ্যে শর্ত গুলি পরীক্ষা করা হবে এবং প্রথম সত্য শর্তটি পূর্ণ হলে সংশ্লিষ্ট কোড চালানো হবে। true শর্তটি সবসময় সঠিক, সুতরাং এটি ডিফল্ট হিসেবে রাখা হয়।
২. with (Pattern Matching in Pipelines)
with Elixir এ একটি সুন্দর প্যাটার্ন ম্যাচিং কন্ট্রোল স্টেটমেন্ট যা পিপলাইনে কাজ করার সময় ব্যবহার করা হয়। এটি সাধারণত অনেক গুলো প্যাটার্ন বা ফলাফল যাচাই করতে ব্যবহৃত হয়, এবং এটি হ্যান্ডলিং এর জন্য খুবই উপকারী।
বৈশিষ্ট্য:
withএকাধিক প্যাটার্নের মাধ্যমে নির্দিষ্ট কোড ব্লককে অনুসরণ করে।- এটি error handling এর জন্য খুব কার্যকর।
- একটি সফল প্যাটার্ন মেলালে
doব্লক চালানো হয়, অন্যথায় একটিelseব্লক চালানো হতে পারে।
ব্যবহার:
with {:ok, value} <- function1(),
{:ok, result} <- function2(value) do
IO.puts("Success: #{result}")
else
{:error, reason} -> IO.puts("Error: #{reason}")
endউদাহরণ:
defmodule MyModule do
def process_data do
with {:ok, file} <- File.open("data.txt"),
{:ok, contents} <- IO.read(file, :all) do
IO.puts("File contents: #{contents}")
else
{:error, reason} -> IO.puts("Failed to read file: #{reason}")
end
end
end
MyModule.process_data()এখানে, with ব্যবহার করে আমরা প্যাটার্ন ম্যাচিং এর মাধ্যমে একটি ফাইল ওপেন করা এবং তারপর তার কন্টেন্ট পড়া চেষ্টা করছি। যদি কোনো প্যাটার্ন ম্যাচ না করে, তবে else ব্লক চালানো হবে।
৩. try (Error Handling)
try Elixir তে একটি গুরুত্বপূর্ণ কন্ট্রোল স্টেটমেন্ট যা error handling এর জন্য ব্যবহৃত হয়। try ব্লকের মধ্যে যদি কোনো ত্রুটি ঘটে, তবে আপনি তা rescue বা after ব্লক ব্যবহার করে ধরতে এবং পরিচালনা করতে পারেন।
বৈশিষ্ট্য:
tryএকটি কোড ব্লক চালানোর চেষ্টা করে।- যদি এর মধ্যে কোনো ত্রুটি ঘটে, তবে
rescueব্লক তা ধরতে পারে এবং আপনি ত্রুটির জন্য কাস্টম অ্যাকশন নিতে পারেন। afterব্লক ব্যবহার করে আপনি কোড চালানোর পরে কিছু ফাইনাল অপারেশন করতে পারেন।
ব্যবহার:
try do
# risky code
1 / 0 # This will raise an error (division by zero)
rescue
ArithmeticError -> IO.puts("An arithmetic error occurred")
endউদাহরণ:
defmodule MyModule do
def safe_division do
try do
1 / 0
rescue
ArithmeticError -> IO.puts("Cannot divide by zero")
after
IO.puts("Execution completed")
end
end
end
MyModule.safe_division()এখানে, try ব্লকের মধ্যে 1 / 0 অপারেশন একটি ত্রুটি ঘটাবে, যা rescue ব্লক দ্বারা ধরবে এবং "Cannot divide by zero" মেসেজটি প্রিন্ট করবে। after ব্লকটি শেষের কাজ যেমন ক্লিন-আপ বা লগিং করতে ব্যবহৃত হয়, এবং এটি সব সময় চালানো হয়।
সারসংক্ষেপ
| স্টেটমেন্ট | বর্ণনা | ব্যবহার |
|---|---|---|
cond | একাধিক শর্ত পরীক্ষা করার জন্য ব্যবহৃত হয়। সত্য শর্তের জন্য কোড চালানো হয়। | কন্ডিশনাল লজিক |
with | প্যাটার্ন ম্যাচিং এবং error handling এর জন্য ব্যবহৃত হয়। একাধিক প্যাটার্ন যাচাই করা হয়। | প্যাটার্ন ম্যাচিং |
try | ত্রুটি ধরার জন্য ব্যবহৃত হয়, যেখানে rescue এবং after ব্লক ব্যবহার করা হয়। | এরর হ্যান্ডলিং |
এই তিনটি স্টেটমেন্ট এলিক্সির কোডে লজিক এবং এরর হ্যান্ডলিং সহজ এবং কার্যকরীভাবে করতে সাহায্য করে, বিশেষ করে যখন আপনি একাধিক শর্ত বা প্যাটার্ন পরীক্ষা করছেন বা ত্রুটি পরিচালনা করছেন।
Guard Clauses এবং তাদের ব্যবহার
Guard Clauses Elixir তে একটি শক্তিশালী কনসেপ্ট, যা শর্তাধীন বিবৃতির মধ্যে অতিরিক্ত শর্ত বা কন্ডিশন যুক্ত করতে সাহায্য করে। এটি মূলত cond, case, if, receive ইত্যাদি স্টেটমেন্টে ব্যবহৃত হয় এবং নির্দিষ্ট শর্তের অধীনে ফাংশন বা এক্সপ্রেশন কীভাবে আচরণ করবে তা নিয়ন্ত্রণ করে।
Guard Clauses সাধারণত কন্ডিশনাল গার্ড হিসেবে ব্যবহৃত হয়, যা একটি নির্দিষ্ট শর্তকে হ্যান্ডেল করে এবং যদি শর্তটি সঠিক হয়, তখন সেই শর্তের জন্য নির্ধারিত কার্যক্রম চালানো হয়।
Guard Clauses এর ধারণা
Guard Clause মূলত একটি শর্ত (condition) যা কিছু নির্দিষ্ট ফাংশন বা এক্সপ্রেশনকে পরীক্ষা করে। এই শর্তটি কোডের মধ্যে অন্য কোন শর্তের সাথে যুক্ত করা হয়। এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে আপনি একাধিক শর্তে একটি ফাংশনকে কাস্টমাইজ করতে চান।
Elixir তে guard clauses সাধারণত when কিওয়ার্ড দিয়ে ব্যবহার করা হয়, যা pattern matching এর সাথে যুক্ত হয়।
Syntax:
def function_name(parameter) when condition do
# code to execute if condition is true
endএখানে when এর পর যে শর্তটি দেওয়া হবে, তা parameter এর সাথে মেলে এবং যদি শর্তটি সত্য হয়, তবে নির্দিষ্ট কোড ব্লকটি রান হবে।
Guard Clauses এর ব্যবহার
১. Pattern Matching এর সাথে Guard Clauses
Elixir তে pattern matching এর সাথে guard clauses ব্যবহার করে শর্তানুসারে কোড চালানো যায়। এটি ব্যবহার করা হয় যখন একটি ফাংশন অনেকগুলো ভিন্ন শর্তের মধ্যে কাজ করে এবং প্রতিটি শর্তে আলাদা আলাদা কার্যকলাপ করতে হয়।
উদাহরণ:
defmodule MyModule do
def check_number(x) when x > 0 do
IO.puts "#{x} is a positive number."
end
def check_number(x) when x < 0 do
IO.puts "#{x} is a negative number."
end
def check_number(0) do
IO.puts "The number is zero."
end
endএখানে, check_number/1 ফাংশনটি তিনটি ভিন্ন শর্তে কাজ করছে:
- যদি সংখ্যা ধনাত্মক (positive) হয়, তবে
x > 0শর্তটি সঠিক হবে এবং সেই অনুযায়ী কোড চালানো হবে। - যদি সংখ্যা ঋণাত্মক (negative) হয়, তবে
x < 0শর্তটি সঠিক হবে। - এবং, যদি সংখ্যা শূন্য (zero) হয়, তবে ০ এর জন্য আলাদা শর্ত দেওয়া হয়েছে।
ব্যবহার:
iex> MyModule.check_number(5)
5 is a positive number.
iex> MyModule.check_number(-3)
-3 is a negative number.
iex> MyModule.check_number(0)
The number is zero.এখানে, when গার্ড শর্তের মাধ্যমে আমরা নিশ্চিত করছি যে প্রতিটি শর্তে আলাদা কাজ হবে।
২. Mathematical Operations এর Guard Clause
আপনি গার্ড ক্লজ ব্যবহার করে গাণিতিক বা লজিক্যাল শর্ত নির্ধারণ করতে পারেন এবং সেগুলির ওপর ভিত্তি করে আলাদা আলাদা কোড এক্সিকিউট করতে পারেন।
উদাহরণ:
defmodule MathModule do
def classify_number(x) when x == 0 do
IO.puts "The number is zero."
end
def classify_number(x) when rem(x, 2) == 0 do
IO.puts "#{x} is an even number."
end
def classify_number(x) when rem(x, 2) != 0 do
IO.puts "#{x} is an odd number."
end
endএখানে, আমরা গার্ড ক্লজ ব্যবহার করে সংখ্যা even বা odd হিসেবে শ্রেণীভুক্ত করছি। এছাড়া, শূন্য (zero) চেকের জন্য আলাদা গার্ড ক্লজ ব্যবহার করা হয়েছে।
ব্যবহার:
iex> MathModule.classify_number(4)
4 is an even number.
iex> MathModule.classify_number(7)
7 is an odd number.
iex> MathModule.classify_number(0)
The number is zero.৩. Multiple Conditions with Guard Clauses
একটি গার্ড ক্লজে একাধিক শর্ত একসাথে পরীক্ষা করতে পারেন। এর মাধ্যমে আপনি বেশি জটিল শর্ত তৈরি করতে পারেন।
উদাহরণ:
defmodule CheckModule do
def check_value(x) when x > 0 and rem(x, 2) == 0 do
IO.puts "#{x} is a positive even number."
end
def check_value(x) when x > 0 and rem(x, 2) != 0 do
IO.puts "#{x} is a positive odd number."
end
def check_value(x) when x < 0 do
IO.puts "#{x} is a negative number."
end
endএখানে, আমরা multiple conditions ব্যবহার করেছি, যেমন:
- একটি সংখ্যা ধনাত্মক এবং সন্নিবদ্ধ (even) হলে, আমরা একটি বিশেষ বার্তা প্রিন্ট করব।
- একটি সংখ্যা ধনাত্মক এবং বিজোড় (odd) হলে, আমরা আলাদা বার্তা প্রিন্ট করব।
- যদি সংখ্যা ঋণাত্মক (negative) হয়, আমরা সেটি আলাদাভাবে হ্যান্ডেল করব।
ব্যবহার:
iex> CheckModule.check_value(6)
6 is a positive even number.
iex> CheckModule.check_value(5)
5 is a positive odd number.
iex> CheckModule.check_value(-3)
-3 is a negative number.Guard Clauses এবং Pattern Matching
Elixir তে গার্ড ক্লজ সাধারণত Pattern Matching এর সাথে ব্যবহার করা হয়। এটি আপনাকে আরও সরলভাবে এবং পরিষ্কারভাবে শর্তাবলী এবং কন্ডিশনাল লজিক লেখার সুযোগ দেয়।
উদাহরণ:
defmodule NumberChecker do
def check(x) when x > 0 do
IO.puts "Positive number"
end
def check(x) when x == 0 do
IO.puts "Zero"
end
def check(x) when x < 0 do
IO.puts "Negative number"
end
endএখানে, check/1 ফাংশনে প্রতিটি শর্তের জন্য একটি গার্ড ক্লজ রয়েছে যা pattern matching এর মাধ্যমে x এর মান পরীক্ষা করে এবং সংশ্লিষ্ট বার্তা প্রদর্শন করে।
সারসংক্ষেপ
Guard Clauses Elixir তে ফাংশনাল প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ। এগুলি when কিওয়ার্ডের মাধ্যমে ব্যবহৃত হয় এবং pattern matching এর সাথে যুক্ত থাকে। গার্ড ক্লজের মাধ্যমে আপনি একটি ফাংশনে একাধিক শর্ত পরীক্ষা করতে পারেন এবং প্রতিটি শর্তের জন্য আলাদা কাজ করতে পারেন। এই কনসেপ্টটি কোডের কাঠামো পরিষ্কার এবং সহজবোধ্য করে তোলে, বিশেষত যখন আপনার একাধিক শর্ত বা পরিস্থিতির মধ্যে কার্যকরভাবে সিদ্ধান্ত নিতে হয়।
Looping এর জন্য for এবং Enum এর ব্যবহার in Elixir
Elixir তে লুপিং করতে সাধারণত for কমান্ড এবং Enum মডিউল ব্যবহৃত হয়। Elixir একটি ফাংশনাল ভাষা, তাই লুপিং এবং ইটারেশন সাধারণভাবে রেকারশন (recursion) এর মাধ্যমে হয়, কিন্তু for এবং Enum মডিউল ব্যবহার করেও আপনি সহজে লুপিং করতে পারেন।
১. for কমান্ড ব্যবহার
Elixir তে for কমান্ড একটি comprehension তৈরি করতে ব্যবহৃত হয় যা লিস্টের উপাদানগুলোর উপর লুপ চালানোর জন্য সুবিধাজনক। এটি একটি প্রকারের list comprehension হিসেবে কাজ করে এবং অনেক ধরণের অ্যাকশন করতে পারে, যেমন ডেটা ফিল্টার, মান ট্রান্সফর্মেশন ইত্যাদি।
for এর মৌলিক ব্যবহার:
# সাধারণ `for` লুপ উদাহরণ
for i <- 1..5 do
IO.puts(i)
endএখানে for i <- 1..5 নির্দেশ করে যে ১ থেকে ৫ পর্যন্ত প্রতিটি সংখ্যার জন্য লুপ চলবে এবং IO.puts(i) প্রতিটি সংখ্যার জন্য আউটপুট হবে। এটি ১, ২, ৩, ৪, ৫ আউটপুট করবে।
আরেকটি উদাহরণ - লিস্টে মান ব্যবহার:
# লিস্টের উপাদান গুলি প্রদর্শন করা
numbers = [1, 2, 3, 4, 5]
for n <- numbers do
IO.puts(n * 2)
endএখানে লিস্ট numbers এর প্রতিটি উপাদানকে গুন করা হচ্ছে ২ দিয়ে, এবং আউটপুট হবে ২, ৪, ৬, ৮, ১০।
Conditional Filtering in for:
আপনি for কম্প্রিহেনশনে কন্ডিশনও যোগ করতে পারেন। যেমন:
# শুধুমাত্র even numbers প্রিন্ট করা
for i <- 1..10, rem(i, 2) == 0 do
IO.puts(i)
endএখানে rem(i, 2) == 0 কন্ডিশনটি শুধু even numbers ফিল্টার করবে, ফলে আউটপুট হবে 2, 4, 6, 8, 10।
২. Enum মডিউল ব্যবহার
Enum মডিউল হল Elixir তে সবচেয়ে ব্যবহৃত মডিউল, যা লিস্ট এবং অন্যান্য কালেকশন (যেমন ম্যাপ, সেট) এর উপর কাজ করার জন্য বিভিন্ন ফাংশন প্রদান করে। Enum মডিউলের ফাংশনগুলি সাধারণত iterating (ইটারেটিং), filtering, এবং transforming ডেটার জন্য ব্যবহৃত হয়।
Enum.each/2 ব্যবহার:
এটি একটি প্রক্রিয়া যা লিস্ট বা কালেকশনের প্রতিটি উপাদানের উপর একটি ফাংশন প্রয়োগ করে।
numbers = [1, 2, 3, 4, 5]
Enum.each(numbers, fn n -> IO.puts(n) end)এখানে Enum.each ফাংশনটি numbers লিস্টের প্রতিটি উপাদান n এর উপর IO.puts প্রয়োগ করে, এবং আউটপুট হবে ১, ২, ৩, ৪, ৫।
Enum.map/2 ব্যবহার:
এটি একটি ট্রান্সফর্মেশন ফাংশন যা একটি নতুন লিস্ট তৈরি করে, যেখানে প্রতিটি উপাদান একটি নির্দিষ্ট ফাংশনের মাধ্যমে পরিবর্তিত হয়।
numbers = [1, 2, 3, 4, 5]
doubled_numbers = Enum.map(numbers, fn n -> n * 2 end)
IO.inspect(doubled_numbers) # আউটপুট: [2, 4, 6, 8, 10]এখানে, Enum.map লিস্টের প্রতিটি উপাদানকে ২ দিয়ে গুণ করে একটি নতুন লিস্ট তৈরি করেছে, যার আউটপুট হবে **[2, 4, 6, 8, 10]**।
Enum.filter/2 ব্যবহার:
এটি একটি ফিল্টারিং ফাংশন যা একটি নতুন লিস্ট তৈরি করে, যেখানে কেবলমাত্র সেই উপাদানগুলি থাকে যা কন্ডিশন মেনে চলে।
numbers = [1, 2, 3, 4, 5]
even_numbers = Enum.filter(numbers, fn n -> rem(n, 2) == 0 end)
IO.inspect(even_numbers) # আউটপুট: [2, 4]এখানে, Enum.filter শুধুমাত্র even numbers ফিল্টার করবে এবং আউটপুট হবে **[2, 4]**।
Enum.reduce/3 ব্যবহার:
Enum.reduce একটি অ্যাগ্রিগেটিং ফাংশন যা একটি লিস্ট বা কালেকশনের উপর এক্সিকিউট হয় এবং একটি একক মান রিটার্ন করে।
numbers = [1, 2, 3, 4, 5]
sum = Enum.reduce(numbers, 0, fn n, acc -> n + acc end)
IO.puts(sum) # আউটপুট: 15এখানে, Enum.reduce লিস্টের উপাদানগুলোকে যোগ করে তাদের সমষ্টি বের করছে। শুরু থেকে শুরু করে প্রতিটি মান এক্সিকিউট হয় এবং acc (অ্যাকিউমুলেটর) এর সাথে যোগ হয়। আউটপুট হবে 15।
৩. Enum এর অন্যান্য কার্যকরী ফাংশন
| ফাংশন | বর্ণনা | উদাহরণ |
|---|---|---|
Enum.all?/2 | সমস্ত উপাদান যদি একটি শর্ত মেনে চলে, তাহলে true ফেরত দেয় | Enum.all?([1, 2, 3], fn x -> x > 0 end) |
Enum.any?/2 | কোনো উপাদান যদি শর্ত মেনে চলে, তাহলে true ফেরত দেয় | Enum.any?([1, 2, 3], fn x -> x > 2 end) |
Enum.count/1 | লিস্টের উপাদানের সংখ্যা গণনা করে | Enum.count([1, 2, 3]) |
Enum.sort/1 | লিস্ট সজ্জিত করে (sort) | Enum.sort([3, 1, 2]) |
Enum.find/2 | প্রথম মান যা শর্ত মেনে চলে, তা ফেরত দেয় | Enum.find([1, 2, 3], fn x -> x > 2 end) |
সারসংক্ষেপ
for এবং Enum Elixir তে লুপিং এবং ইটারেশন করার জন্য বেশ শক্তিশালী এবং কার্যকরী উপায় প্রদান করে। for কমান্ড একধরণের কম্প্রিহেনশন তৈরি করে যা লিস্টের উপাদানগুলোর উপর সহজে কাজ করতে সাহায্য করে, এবং Enum মডিউলটি বিভিন্ন ইটারেটিং, ফিল্টারিং, এবং ট্রান্সফর্মিং অপারেশন সম্পাদন করতে ব্যবহৃত হয়। Elixir তে for এবং Enum ব্যবহার করে কোড আরও সোজা এবং পরিষ্কার করা সম্ভব, যা ফাংশনাল প্রোগ্রামিংয়ের মূল ধারণার সাথে মানানসই।
Read more