Fork me on GitHub

সিজিল

This translation is up to date.

এই অধ্যায়ে আমরা সিজিল দিয়ে কাজ করা ও সিজিল তৈরি করা নিয়ে আলোচনা করব।

সূচীপত্র

Sigils Overview

লিটেরাল দিয়ে কাজ করার একটি ভিন্ন ধরনের পন্থা এলিক্সির দিয়ে থাকে, তা হল সিজিল। সিজিল শুরু হয় টিল্ডা ~ অপারেটর দিয়ে যার পরে একটি ক্যারেক্টার আসে। এলিক্সির নিজে কিছু বীল্ট-ইন সিজিল দেয়, তবে আমরা নিজেরাও সিজিল দরকারমত তৈরী করে নিতে পারি। সিজিল এলিক্সির ল্যাঙ্গুয়েজকে কাস্টমাইজ ও বর্ধিত করার অন্যতম একটি পন্থা।

বীল্ট-ইন সিজিলের একটি লিস্ট নীচে দেয়া হয়েছে-

আর ডেলিমিটারের লিস্ট হল-

কার লিস্ট

~c আর ~C ক্যারেক্টার লিস্ট সৃষ্টি করে যেমন-

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

লক্ষ্য করুন ~c ক্যাল্কুলেশান করে থাকে কিন্তু ~C তা করে না। পরবর্তীতে আমরা দেখব যে আপার কেইস ও লোয়ার কেইস প্রায়েই ব্যবহৃত হয় বীল্ট-ইন সিজিলে।

রেগুলার এক্সপ্রেশান

~r~R সিজিল দিয়ে রেগুলার এক্সপ্রেশান সৃষ্টি করা হয়। আমরা হয় সরাসরি অথবা Regex ফাংশনে তা ব্যবহার করি-

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

দেখা যাচ্ছে যে প্রথমে আমরা সমতা টেস্ট করছি, অর্থাৎ এলিক্সির রেগুলার এক্সপ্রেশানেরসাথে ম্যাচ করছে না। এর কারণ এটি ক্যাপিটালাইজড। আর যেহেতু এলিক্সির পার্ল কম্প্যাটিবল রেগুলার এক্সপ্রেশান (PCRE) সাপোর্ট করে, আমরা সিজিলের শেষে i অ্যাড করে সিজিলকে জানিয়ে দিতে পারি যে কেইস সেনসিটিভ হওয়ার দরকার নেই।

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

আবার এলিক্সির Regex এপিআই দিয়ে থাকে যা এরল্যাঙ্গের রেগুলার এক্সপ্রেশান লাইব্রেরীর উপর তৈরি।

চলুন Regex.split/2 কে রেজেক্স সিজিল দিয়ে বানাই-

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

"100_000_000" কে আন্ডারস্কোরের মাধ্যমে স্প্লিট করা হয়েছে ~r/_/ সিজিলের সাহায্যে। Regex.split ফাংশন লিস্ট প্রদান করে থাকে।

স্ট্রিং

স্ট্রিং ডাটা আপনি পাবেন সিজিল ~s~S এর মাধ্যমে-

iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"

iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"

পার্থক্য হল এস্কেপ সিকুয়েন্সে। নীচের দুটি উদাহরণ দেখা যাক-

iex> ~s/welcome to elixir #{String.downcase "school"}/
"welcome to elixir school"

iex> ~S/welcome to elixir #{String.downcase "school"}/
"welcome to elixir \#{String.downcase \"school\"}"

ওয়ার্ড লিস্ট

ওয়ার্ড লিস্ট অনেক ক্ষেত্রে ব্যবহৃত হয় যা সময় ও কী-স্টোক দুটোই বাচায় এবং আমাদের কোডবেইসের জটিলতা অনেকাংশে লাঘব করে-

iex> ~w/i love elixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love elixir school/
["i", "love", "elixir", "school"]

ডেলিমিটারের ভেতর স্পেইস নির্ণয় করে লিস্ট বিভাজন। উপরের উদাহরণ দুটিতে কোন পার্থক্য না থাকলেও এক্সেপ সিকুয়েন্স ও ইন্টারপলেশন ভেদে পার্থক্য হবে যেমন-

iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]

নাইভ ডেট টাইম

নাইভ ডেট টাইম দিয়ে আমরা তাড়াতাড়ি স্ট্রাক্ট তৈরি করতে পারি যা ডেট টাইম কে রিপ্রেজেন্ট করে টাইমজোন ছাড়া।

বেশীরভাগ ক্ষেত্রেই আমরা সরাসরি NaiveDateTime স্ট্রাক্ট ব্যবহার করব কিন্তু প্যাটার্ন ম্যাচিং করার সময়ে সিজিল অনেক কাজে আসে-

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}

নিজস্ব সিজিল তৈরি

এলিক্সিরের অন্যতম উদ্দেশ্য হল অত্যন্ত এক্সটেনসিবল অর্থাৎ বর্ধনশীল ল্যাঙ্গুয়েজ হিসেবে ব্যবহৃত হওয়া। কাজেই অবাক হবার কিছুই নেই যে আমরা নিজেরাই কাস্টম সিজিল ব্যবহার করতে পারি। এই উদাহরণে আমরা কাস্টম সিজিল ব্যবহার করব যা একটি স্ট্রিংকে আপার কেইসে পরিণত করবে। যেহেতু এলিক্সিএরর স্ট্রিং মডিউলে একটি ফাংশন (String.upcase/1) রয়েছে এ কাজের জন্য তাই আমরা সেটিই ব্যবহার করব।


iex> defmodule MySigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MySigils
nil

iex> ~u/elixir school/
ELIXIR SCHOOL

প্রথমে আমরা MySigils নামক একটি মডিউল সৃষ্টি করে এর ভেতর sigil_u নামে একটি ফাংশন বানিয়েছি। যেহেতু ~u সিজিলের কোন অস্তিত্ব নেই তাই সেটিকে আমরা আমাদের উদ্দেশ্যে ব্যবহার করলাম। _u দিয়ে বুঝানো হয়েছে যে টিল্ডার (~) পর ব্যবহৃত ক্যারেক্টার হবে u। শর্ত হল যে ফাংশন ২ টি আর্গুমেন্ট নিবে, একটি হল ইনপুট আর শেষেরটি হল লিস্ট।


Contributors

loading...



পৃষ্ঠা শেয়ার করুন