Crystal একটি কম্পাইলড, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা। ভাষাটির কিছু লক্ষ্য হলো:
Ruby থেকে অনুপ্রাণিত সিনট্যাক্স।
স্ট্যাটিকভাবে টাইপ-চেক করা হয়, কিন্তু ভ্যারিয়েবল বা মেথড আর্গুমেন্টের টাইপ আলাদা করে উল্লেখ করতে হয় না।
Crystal-এ বাইন্ডিং লিখে C কোড কল করা যায়।
কম্পাইল টাইমে কোড মূল্যায়ন ও তৈরি করার সুবিধা, যাতে বয়লারপ্লেট কোড এড়ানো যায়।
দক্ষ নেটিভ কোডে কম্পাইল হয়।
Crystal-এর কাজ শুরু হয় ২০১১ সালে, লক্ষ্য ছিল Ruby-এর সৌন্দর্য ও উৎপাদনশীলতার পাশাপাশি একটি কম্পাইলড ভাষার পারফরম্যান্স ও টাইপ নিরাপত্তা যুক্ত একটি ভাষা তৈরি করা। ভাষার কম্পাইলারটি প্রথমে Ruby-তে লেখা হয়েছিল, কিন্তু ২০১৩ সালে এটি Crystal-এ নতুন করে লেখা হয়। Ary Borenszweig, Juan Wajnerman এবং Brian Cardiff এই ভাষাটি ডিজাইন ও ডেভেলপ করেছেন।
একটি ভ্যারিয়েবল ডিক্লেয়ার করতে = অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন।
Crystal-এ ভ্যারিয়েবলের নাম snake_case ফরম্যাটে হওয়া উচিত।
number = 1
puts number # => 1
number = 2
puts number # => 2
কনস্ট্যান্ট ঘোষণা করতেও একই = অ্যাসাইনমেন্ট অপারেটর ব্যবহার করা হয়, তবে এতে সব বড় হাতের অক্ষর ব্যবহার হয়, যাকে SCREAMING_SNAKE_CASE বলা হয়।
NUMBER = 1
puts NUMBER # => 1
আগে থেকেই ডিফাইন করা কোনো কনস্ট্যান্টে মান অ্যাসাইন করলে কম্পাইল-টাইম এরর হবে।
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal একটি কম্পাইলড ভাষা, অর্থাৎ কম্পাইল টাইমে প্রতিটি ভ্যারিয়েবল বা মেথড আর্গুমেন্টের একটি টাইপ নির্ধারিত হয়। কম্পাইলার একটি ভ্যারিয়েবল বা মেথড আর্গুমেন্টের টাইপ অনুমান করতে পারে। তবে কিছু ক্ষেত্রে টাইপ স্পষ্টভাবে উল্লেখ করা প্রয়োজন হয়। কোন কোন ক্ষেত্রে টাইপ নির্ধারণ করা লাগে, তা পরের কনসেপ্টগুলোতে ব্যাখ্যা করা হবে।
মেথড হলো কিছু নির্দেশ একসাথে গুছিয়ে রাখার একটি উপায়, যেগুলো বারবার ব্যবহার করা যায়।
Crystal-এ মেথড সাধারণত একটি ক্লাস, মডিউল বা স্ট্রাক্টের ভেতরে ডিফাইন করা হয়।
তবে মেথড ক্লাস, মডিউল বা স্ট্রাক্টের বাইরেও ডিফাইন করা যায়।
মেথড ঘোষণা করা হয় def কিওয়ার্ড দিয়ে, তারপর থাকে মেথডের নাম।
Crystal-এ মেথডের নাম snake_case-এ লেখা উচিত।
মেথডে কোনো আর্গুমেন্ট না থাকলে আপনি বন্ধনী বাদ দিতে পারেন।
মেথডের শেষ বোঝাতে end কিওয়ার্ড ব্যবহার করতে হয়।
def hello
puts "Hello World!"
end
ভ্যারিয়েবল বা মেথড আর্গুমেন্টের টাইপের জন্য নেই এমন কোনো মেথড ব্যবহার করলে কম্পাইল-টাইম এরর হবে।
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
মেথডে আর্গুমেন্ট থাকতে পারে। আর্গুমেন্ট হলো এমন ডেটা যা মেথডে পাঠানো হয়। মেথডকে আর্গুমেন্ট দিতে হলে আর্গুমেন্টের নাম উল্লেখ করতে হবে। Crystal-এ আর্গুমেন্টের নাম snake_case-এ লেখা উচিত। একটি মেথডে একাধিক আর্গুমেন্ট থাকতে পারে, তবে সেগুলোকে কমা দিয়ে আলাদা করতে হবে।
def hello(name)
puts "Hello #{name}!"
end
মেথডে একাধিক আর্গুমেন্টও থাকতে পারে। সেক্ষেত্রে আর্গুমেন্টগুলো কমা দিয়ে আলাদা করতে হবে।
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
ক্লাস, মডিউল বা স্ট্রাক্টের অন্তর্গত কোনো মেথড কল করার সময় ডট অপারেটর (.) ব্যবহার করতে হয়।
ফরম্যাট হবে: <ClassName>.<method_name>।
কোনো মেথড ক্লাস, মডিউল বা স্ট্রাক্টের অন্তর্গত না হলে শুধু তার নাম লিখেই কল করা যায়।
মেথড সবসময় শেষ এক্সপ্রেশনের মানটি পরোক্ষভাবে রিটার্ন করে।
মেথডে আর্গুমেন্ট থাকলে মেথড কল ও ডেফিনিশনে আর্গুমেন্ট উল্লেখ করার সময় বন্ধনী ব্যবহার করতে পারেন, এভাবে: <method_name>(<argument_1>, <argument_2>, ...)।
মেথডে কোনো আর্গুমেন্ট না থাকলে বন্ধনী বাদ দেওয়া উচিত।
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
একাধিক আর্গুমেন্ট নিয়ে মেথড কল করার সময় আর্গুমেন্টগুলো কমা দিয়ে আলাদা করতে হবে। আর্গুমেন্টগুলো মেথডের আর্গুমেন্টের ক্রম অনুযায়ীই দিতে হবে।
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
ভুল সংখ্যক আর্গুমেন্ট দিয়ে মেথড কল করলে কম্পাইল-টাইম এরর হবে।
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
Crystal-এ দুটি সংখ্যা যোগ করতে + অপারেটর ব্যবহার করতে পারেন।
দুটি সংখ্যা বিয়োগ করতেও - অপারেটর ব্যবহার করা যায়।
আর দুটি সংখ্যা গুণ করতে * অপারেটর ব্যবহার করা যায়।
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
Crystal-এ কমেন্ট লেখা হয় # চিহ্ন দিয়ে, তারপর একটি স্পেস এবং তারপর কমেন্ট।
কমেন্ট কোড ডকুমেন্ট করতে ব্যবহার করা হয়।
কম্পাইলার কমেন্ট এক্সিকিউট করে না।
# This is a comment