Elixir একটি ডাইনামিকালি-টাইপড ভাষা, অর্থাৎ কোনো ভ্যারিয়েবলের টাইপ কেবল রানটাইমেই যাচাই করা হয়। ম্যাচ = অপারেটরের সাহায্যে আমরা যেকোনো টাইপের একটি মান একটি ভ্যারিয়েবলের নামের সাথে বেঁধে দিতে পারি:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir একটি ফাংশনাল প্রোগ্রামিং ভাষা এবং এতে সব নামযুক্ত ফাংশন একটি মডিউলে ডিফাইন করা আবশ্যক। মডিউল ডিফাইন করতে defmodule কিওয়ার্ডটি ব্যবহার করা হয়। সব মডিউল রানটাইমে অন্য সব মডিউলের কাছে পাওয়া যায় এবং প্রোগ্রামের অন্য অংশের কাছে সেগুলো দৃশ্যমান করতে কোনো অ্যাক্সেস মডিফায়ার-এর দরকার হয় না। একটি মডিউল অন্য প্রোগ্রামিং ভাষার ক্লাস-এর সমতুল্য।
defmodule Calculator do
# ...
end
নামযুক্ত ফাংশন অবশ্যই একটি মডিউলে ডিফাইন করতে হয়। একটি পাবলিক নামযুক্ত ফাংশন ডিফাইন করতে def কিওয়ার্ডটি ব্যবহার করা হয়।
প্রতিটি ফাংশনে শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে। কোনো ফাংশনের শেষ এক্সপ্রেশনের মান সবসময় অন্তর্নিহিতভাবে রিটার্ন হয়।
defmodule Calculator do
def add(x, y) do
x + y
end
end
কোনো ফাংশন কল করতে হলে তার মডিউল ও ফাংশনের নাম লিখে ফাংশনের প্রতিটি আর্গুমেন্টের জন্য মান পাস করতে হয়।
sum = Calculator.add(1, 2)
# => 3
একটি প্রাইভেট ফাংশন ডিফাইন করতে def-এর বদলে defp কিওয়ার্ডটি ব্যবহার করা যায়। প্রাইভেট ফাংশন কেবল যে মডিউল সেটি ডিফাইন করেছে, তার ভেতর থেকেই ব্যবহার করা যায়।
যে মডিউলে কোনো ফাংশন ডিফাইন করা হয়েছে, সেই মডিউলের ভেতর থেকে সেটি কল করার সময় মডিউলের নাম বাদ দেওয়া যায়।
এক লাইনের সিনট্যাক্স ব্যবহার করে ছোট ফাংশনও লিখতে পারেন (লক্ষ্য করুন do কিওয়ার্ডের চারপাশে কমা , আর কোলন :)।
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
ফাংশনকে তার অ্যারিটি দিয়ে উল্লেখ করা বেশ সাধারণ ব্যাপার। একটি ফাংশনের অ্যারিটি হলো সে কতগুলো আর্গুমেন্ট নেয় তার সংখ্যা।
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
মডিউলের নামে PascalCase ব্যবহার করা উচিত। মডিউলের নাম অবশ্যই একটি বড় হাতের অক্ষর A-Z দিয়ে শুরু হতে হবে এবং এতে অক্ষর a-zA-Z, সংখ্যা 0-9 আর আন্ডারস্কোর _ থাকতে পারে।
ভ্যারিয়েবল ও ফাংশনের নামে snake_case ব্যবহার করা উচিত। ভ্যারিয়েবল বা ফাংশনের নাম অবশ্যই ছোট হাতের অক্ষর a-z বা একটি আন্ডারস্কোর _ দিয়ে শুরু হতে হবে, এতে অক্ষর a-zA-Z, সংখ্যা 0-9 ও আন্ডারস্কোর _ থাকতে পারে এবং শেষে একটি জিজ্ঞাসাচিহ্ন ? বা বিস্ময়চিহ্ন ! থাকতে পারে।
Elixir-এর স্ট্যান্ডার্ড লাইব্রেরি অনেক সমৃদ্ধ ও সুন্দরভাবে ডকুমেন্টেড। ডকুমেন্টেশন অনলাইনে hexdocs.pm/elixir ঠিকানায় পাওয়া যায়। এই লিঙ্কটি কোথাও সেভ করে রাখুন, এটি আপনার অনেক কাজে আসবে!
বেশিরভাগ বিল্ট-ইন ডেটা টাইপের জন্যই একটি সংশ্লিষ্ট মডিউল আছে, যেখানে সেই ডেটা টাইপ নিয়ে কাজ করার ফাংশন থাকে। যেমন ইন্টিজারের জন্য Integer মডিউল, স্ট্রিংয়ের জন্য String মডিউল, অ্যারের জন্য List মডিউল ইত্যাদি।
উল্লেখযোগ্য একটি মডিউল হলো Kernel মডিউল। এটি সেই মৌলিক সক্ষমতাগুলো দেয় যার ওপর ভিত্তি করে স্ট্যান্ডার্ড লাইব্রেরির বাকি অংশ তৈরি, যেমন গাণিতিক অপারেটর, কন্ট্রোল-ফ্লো ম্যাক্রো আরও অনেক কিছু। Kernel মডিউলের ফাংশনগুলো স্বয়ংক্রিয়ভাবে ইমপোর্ট হয়, তাই Kernel. প্রিফিক্স ছাড়াই সেগুলো ব্যবহার করতে পারেন।
সোর্স কোড পড়বে এমন অন্য ডেভেলপারদের জন্য নোট রেখে যেতে কমেন্ট ব্যবহার করা যায়। Elixir-এ এক লাইনের কমেন্টের আগে # বসে।
এই অনুশীলনীতে আপনি আপনার প্রিয় রান্নার বইয়ের একটি দুর্দান্ত লাসাগনা রান্না করতে সাহায্য করার জন্য কিছু কোড লিখবেন।
আপনার সামনে পাঁচটি কাজ রয়েছে, যার সবগুলোই লাসাগনা রান্নায় ব্যয় হওয়া সময়ের সাথে সম্পর্কিত।
Lasagna.expected_minutes_in_oven/0 ফাংশনটি ডিফাইন করুন, যেটি কোনো আর্গুমেন্ট নেয় না এবং লাসাগনাটি ওভেনে কত মিনিট থাকা উচিত তা রিটার্ন করে। রান্নার বই অনুযায়ী, ওভেনে প্রত্যাশিত সময় ৪০ মিনিট:
Lasagna.expected_minutes_in_oven()
# => 40
Lasagna.remaining_minutes_in_oven/1 ফাংশনটি ডিফাইন করুন, যেটি আর্গুমেন্ট হিসেবে লাসাগনাটি আসলে কত মিনিট ধরে ওভেনে আছে তা নেয় এবং আগের কাজের ওভেনে প্রত্যাশিত সময়ের ভিত্তিতে লাসাগনাটিকে আর কত মিনিট ওভেনে থাকতে হবে তা রিটার্ন করে।
Lasagna.remaining_minutes_in_oven(30)
# => 10
Lasagna.preparation_time_in_minutes/1 ফাংশনটি ডিফাইন করুন, যেটি আর্গুমেন্ট হিসেবে লাসাগনায় আপনি কতগুলো স্তর যোগ করেছেন সেই সংখ্যা নেয় এবং লাসাগনা প্রস্তুত করতে আপনার কত মিনিট লেগেছে তা রিটার্ন করে, ধরে নিয়ে যে প্রতিটি স্তর প্রস্তুত করতে আপনার ২ মিনিট লাগে।
Lasagna.preparation_time_in_minutes(2)
# => 4
Lasagna.total_time_in_minutes/2 ফাংশনটি ডিফাইন করুন, যেটি দুটি আর্গুমেন্ট নেয়: প্রথম আর্গুমেন্টটি হলো লাসাগনায় আপনি কতগুলো স্তর যোগ করেছেন সেই সংখ্যা, আর দ্বিতীয় আর্গুমেন্টটি হলো লাসাগনাটি কত মিনিট ধরে ওভেনে আছে সেই সংখ্যা। ফাংশনটি রিটার্ন করবে লাসাগনা রান্নার কাজে আপনার মোট কত মিনিট লেগেছে, অর্থাৎ প্রস্তুতির সময় (মিনিটে) এবং এই মুহূর্তে লাসাগনাটি ওভেনে যত মিনিট কাটিয়েছে তার যোগফল।
Lasagna.total_time_in_minutes(3, 20)
# => 26
Lasagna.alarm/0 ফাংশনটি ডিফাইন করুন, যেটি কোনো আর্গুমেন্ট নেয় না এবং লাসাগনাটি খাওয়ার জন্য তৈরি হয়ে গেছে বোঝায় এমন একটি বার্তা রিটার্ন করে।
Lasagna.alarm()
# => "Ding!"
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।