Elixir-এর atom টাইপ একটি নির্দিষ্ট ধ্রুবক বোঝায়। একটি অ্যাটমের মান আসলে তার নিজের নামটাই। এতে ডেটার সাথে কাজ করার একটি টাইপ-সেফ উপায় পাওয়া যায়। অ্যাটম নিচের মতো করে ডিফাইন করা যায়:
# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom
অভ্যন্তরীণভাবে অ্যাটম একটি লুকআপ টেবিলে একটি ইন্টিজার দিয়ে রিপ্রেজেন্ট করা হয়, যা স্বয়ংক্রিয়ভাবে সেট হয়ে যায়। এই অভ্যন্তরীণ মানটি পরিবর্তন করা সম্ভব নয়।
অনেক সময় আমাদের এমন কোড লিখতে হয় যা কোনো শর্তের ভিত্তিতে ভিন্ন ভিন্ন শাখায় ভাগ হয়ে যায়। Elixir-এ এটি করার অনেক উপায় আছে, তবে তার মধ্যে সবচেয়ে সহজ উপায়গুলোর একটি হলো cond/1 ব্যবহার করা।
সবচেয়ে সহজভাবে বললে, cond এক বা একাধিক শাখার মধ্যে প্রথম যে পথটি true হিসেবে গণ্য হয় সেটিই অনুসরণ করে:
cond do
x > 10 -> :this_might_be_the_way
y < 7 -> :or_that_might_be_the_way
true -> :this_is_the_default_way
end
কোনো পথ যদি true হিসেবে গণ্য না হয়, তাহলে রানটাইম একটি এরর রেইজ করে।
আপনি এমন একটি সিস্টেম চালাচ্ছেন যেখানে কয়েকটি অ্যাপ্লিকেশন প্রচুর লগ তৈরি করে। আপনি একটি ছোট প্রোগ্রাম লিখতে চান, যা সেই লগগুলো একত্রিত করবে এবং সেগুলোর সিভিয়ারিটি লেভেল অনুযায়ী লেবেল দেবে। আপনার সিস্টেমের সব অ্যাপ্লিকেশন একই লগ কোড ব্যবহার করে, তবে কিছু লিগ্যাসি অ্যাপ্লিকেশন সব কোড সমর্থন করে না।
| লগ কোড | লগ লেবেল | লিগ্যাসি অ্যাপে সমর্থিত? |
|---|---|---|
| 0 | trace | না |
| 1 | debug | হ্যাঁ |
| 2 | info | হ্যাঁ |
| 3 | warning | হ্যাঁ |
| 4 | error | হ্যাঁ |
| 5 | fatal | না |
| অন্যান্য / অসমর্থিত | unknown | - |
LogLevel.to_label/2 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি ইন্টিজার কোড এবং একটি বুলিয়ান ফ্ল্যাগ নেবে, যা বলে দেবে লগটি কোনো লিগ্যাসি অ্যাপ থেকে এসেছে কি না, এবং একটি অ্যাটম হিসেবে লগ লাইনের লেবেল রিটার্ন করবে।
টেবিলে উল্লেখ না থাকা লগ কোডের ক্ষেত্রে unknown লেবেল রিটার্ন করা উচিত। টেবিলে লিগ্যাসি অ্যাপে অসমর্থিত হিসেবে উল্লেখ থাকা লগ কোড থেকেও unknown লেবেল রিটার্ন করা উচিত, যদি লগটি লিগ্যাসি অ্যাপ থেকে এসে থাকে।
LogLevel.to_label(0, false)
# => :trace
LogLevel.to_label(0, true)
# => :unknown
অপ্রত্যাশিত কিছু ঘটলে কাউকে জানাতে হবে।
কার কাছে অ্যালার্ট পাঠাতে হবে তা নির্ধারণ করতে LogLevel.alert_recipient/2 ফাংশনটি ইমপ্লিমেন্ট করুন। ফাংশনটি একটি ইন্টিজার কোড এবং একটি বুলিয়ান ফ্ল্যাগ নেবে, যা বলে দেবে লগটি কোনো লিগ্যাসি অ্যাপ থেকে এসেছে কি না, এবং একটি অ্যাটম হিসেবে প্রাপকের নাম রিটার্ন করবে।
আগের কাজের LogLevel.to_label/2 ফাংশনটি ব্যবহার করুন। যদি লগ লেবেল error বা fatal হয়, তবে অ্যালার্টটি ops টিমকে পাঠান। লিগ্যাসি সিস্টেম থেকে unknown লেবেলযুক্ত লগ পেলে অ্যালার্টটি dev1 টিমকে পাঠান, আর অন্য অজানা লেবেলগুলো dev2 টিমকে পাঠাতে হবে। বাকি সব লগ লেবেল নিরাপদে উপেক্ষা করা যায়, সেক্ষেত্রে false রিটার্ন করুন।
LogLevel.alert_recipient(-1, true)
# => :dev1
LogLevel.alert_recipient(0, false)
# => false
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।