Cairo-এর কোর লাইব্রেরি একটি Array টাইপ ইমপ্লিমেন্ট করে।
এটি অন্য প্রোগ্রামিং ভাষায় দেখা সাধারণ অ্যারে টাইপগুলোর মতোই, তবে কয়েকটি গুরুত্বপূর্ণ পার্থক্য আছে:
Array টাইপের পেছনে দক্ষতার সাথে যোগ করা যায়, আর কেবল সামনে থেকে দক্ষতার সাথে সরানো যায়।ArrayTrait::new ফাংশন এবং array! ম্যাক্রো দিয়ে অ্যারে তৈরি করা যায়:
let empty: Array<u32> = ArrayTrait::new();
let one_to_four = array![1, 2, 3, 4];
ArrayTrait::append ফাংশন দিয়ে অ্যারেতে এলিমেন্ট যোগ করা যায়:
let mut num_array = array![1, 2, 3, 4];
num_array.append(5);
// -> [1, 2, 3, 4, 5]
ArrayTrait::pop_front ফাংশন দিয়ে অ্যারে থেকে এলিমেন্ট সরানো যায়:
let mut one_to_four = array![1, 2, 3, 4];
one_to_four.pop_front();
// -> [2, 3, 4]
Cairo একটি Span টাইপও নিয়ে আসে, যা Array-এর একটি "স্ন্যাপশট"-এর মতো আচরণ করে।
ToSpanTrait::span ফাংশন দিয়ে প্রতিটি Array-কে একটি Span-এ রূপান্তর করা যায়:
let one_to_four = array![1, 2, 3, 4];
let one_to_four_span = one_to_four.span();
// -> [1, 2, 3, 4]
অ্যারে-কে Span-এ রূপান্তর করা খুবই দক্ষ, কারণ Span কেবল একটি ডেটা স্ট্রাকচার, যা Cairo-কে অ্যারের একটি অংশ "দেখতে" দেয়, এটি কোনোভাবেই অ্যারেটি পরিবর্তন করে না।
অ্যারে-কে Span-এ রূপান্তর করে Cairo সরাসরি Array-এর উপর যেসব অপারেশন অনুমোদিত হতো তার চেয়ে বেশি অপারেশন করার সুযোগ দেয়, যেমন span-এর সামনে থেকে একটি এলিমেন্ট সরিয়ে ফেলা।
let one_to_four = array![1, 2, 3, 4];
let mut one_to_four_span = one_to_four.span();
one_to_four_span.pop_back();
// -> [2, 3, 4]
লক্ষ্য করুন, pop_back কল করার জন্য আমাদের mut কিওয়ার্ড দিয়ে one_to_four_span-কে মিউটেবল করতে হয়েছিল, যা span-টি অ্যারের যে অংশটি "দেখছে" সেটি ছোট করে span-টিকে মিউটেট করে।
ভবিষ্যতের জাদুকর হিসেবে এলিসকে কিছু মৌলিক বিষয় অনুশীলন করতে হবে।
তার কাছে কার্ডের একটি স্ট্যাক আছে, যেটি সে নাড়াচাড়া করতে চায়।
কাজটি একটু সহজ করতে সে শুধু ১ থেকে ১০ সংখ্যার কার্ডগুলোই ব্যবহার করে।
কার্ডের স্ট্যাকটি একটি Array দিয়ে প্রকাশ করা হয়, যেখানে স্ট্যাকের নিচের অংশটি অ্যারের সামনে এবং স্ট্যাকের উপরের অংশটি অ্যারের পিছনে থাকে।
insert_top ফাংশনটি ইমপ্লিমেন্ট করুন, যা স্ট্যাকের একটি কপি রিটার্ন করে, যাতে নতুন দেওয়া কার্ডটি স্ট্যাকের উপরে যোগ করা থাকে।
let stack = array![5, 9, 7, 1];
insert_top(stack, 8);
// -> [5, 9, 7, 1, 8]
remove_top_card ফাংশনটি ইমপ্লিমেন্ট করুন, যা স্ট্যাকের একটি কপি রিটার্ন করে, যার উপরের কার্ডটি সরিয়ে ফেলা হয়েছে।
যদি দেওয়া স্ট্যাকটি খালি হয়, তাহলে মূল স্ট্যাকটি অপরিবর্তিত অবস্থায় রিটার্ন করা উচিত।
let stack = array![3, 2, 6, 4, 8];
remove_top_card(stack);
// -> [3, 2, 6, 4]
insert_bottom ফাংশনটি ইমপ্লিমেন্ট করুন, যা স্ট্যাকের একটি কপি রিটার্ন করে, যাতে নতুন দেওয়া কার্ডটি স্ট্যাকের নিচে যোগ করা থাকে।
let stack = array![5, 9, 7, 1];
insert_bottom(stack, 8);
// -> [8, 5, 9, 7, 1]
remove_bottom_card ফাংশনটি ইমপ্লিমেন্ট করুন, যা স্ট্যাকের একটি কপি রিটার্ন করে, যার নিচের কার্ডটি সরিয়ে ফেলা হয়েছে।
যদি দেওয়া স্ট্যাকটি খালি হয়, তাহলে মূল স্ট্যাকটি অপরিবর্তিত অবস্থায় রিটার্ন করা উচিত।
let stack = array![8, 5, 9, 7, 1];
remove_bottom_card(stack);
// -> [5, 9, 7, 1]
check_size_of_stack ফাংশনটি ইমপ্লিমেন্ট করুন, যা যাচাই করে স্ট্যাকের আকার দেওয়া stack_size-এর সমান কি না।
let stack = array![3, 2, 6, 4, 8];
check_size_of_stack(stack, 4);
// -> false
কেন কায়রোতে অ্যারে নিয়ে কাজ করা অন্য প্রোগ্রামিং ভাষার মতো সহজ নয়, তা বুঝতে হলে মনে রাখা সহায়ক যে কায়রো একটি ইমিউটেবল মেমরি মডেল ব্যবহার করে, যার মানে হল একবার কোনো মেমরি সেলে লেখা হলে সেটি কখনোই ওভাররাইট করা যায় না, শুধু পড়া যায়।
ভাষাটি এই বৈশিষ্ট্যটিকে কিছুটা অ্যাবস্ট্রাক্ট করে দেয়, যা ডেভেলপারদের তাদের ভ্যারিয়েবলগুলো এমনভাবে ডিক্লেয়ার ও ব্যবহার করতে দেয় যেন সেগুলো মিউটেবল।
যদিও এটি code লেখাকে একটু বেশি চ্যালেঞ্জিং করে তোলে, বিশেষ করে সেই code যা Array টাইপ ব্যবহার করে (ByteArray সহ, যা আসলে একটি "বাইটের অ্যারে"), এটি প্রমাণযোগ্য প্রোগ্রাম লেখা সম্ভব করে, যা অবিশ্বস্ত মেশিনেও আত্মবিশ্বাসের সাথে চালানো যায়, যা এই ট্রেড-অফকে যথেষ্ট সার্থক করে তোলে।
Exercism-এ সাইন আপ করুন, Cairo ট্র্যাকের 25টি কনসেপ্ট68টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।