বাইনারি ডেটা নিয়ে কাজ করা জটিল হতে পারে, তাই Gleam একটি BitArray টাইপ এবং সেই সঙ্গে বাইনারি ডেটা তৈরি ও প্যাটার্ন ম্যাচ করার সিনট্যাক্স প্রদান করে।
বিট অ্যারে লিটারেল <<>> সিনট্যাক্স দিয়ে ডিফাইন করা হয়। একটি বিট অ্যারে লিটারেল ডিফাইন করার সময় সেটি সেগমেন্টে সেগমেন্টে ডিফাইন করা হয়। প্রতিটি সেগমেন্টে একটি মান ও একটি অ্যানোটেশন থাকে, যা একটি : দিয়ে আলাদা করা হয়। অ্যানোটেশনটি নির্দিষ্ট করে মানটি এনকোড করতে কত বিট ব্যবহার হবে, এবং এটি সম্পূর্ণ বাদ দেওয়া যায়, যার ফলে ডিফল্টভাবে ৮-বিটের একটি ইন্টিজার মান ধরা হয়।
// This defines a bit array with three segments of a single bit each
<<0:1, 1:1, 0:1>>
// This defines a bit array with three segments of 8 bits each
<<0, 1, 0>>
:1 হিসেবে টাইপ উল্লেখ করা :size(1) লেখার একটি শর্টহ্যান্ড। বিট সাইজ যদি কোনো ভ্যারিয়েবল থেকে আসে, তাহলে আপনাকে বড় সিনট্যাক্সটি ব্যবহার করতে হবে।
let segment_size = 1
<<0:size(segment_size), 1:size(segment_size), 0:size(segment_size)>>
বাইনারি ইন্টিজার লিটারেল লেখার সময়, লিটারেলের আগে 0b বসিয়ে আমরা সেগুলো সরাসরি বেস-২ নোটেশনে লিখতে পারি। মনে রাখবেন, টেস্টে বা আপনার প্রোগ্রামে প্রিন্ট করলে এগুলো দশমিক সংখ্যা হিসেবে দেখানো হবে।
<<0b1011:4>> == <<11:4>>
// -> True
সেগমেন্টের মান যদি সেগমেন্টের টাইপের ধারণক্ষমতা ছাড়িয়ে যায়, তাহলে এটি বাম দিক থেকে ট্রাঙ্কেট করা হবে।
<<0b1011:3>> == <<0b0011:3>>
// -> True
বিট অ্যারে সিনট্যাক্স ব্যবহার করে আপনি একটি বিদ্যমান বিট অ্যারের আগে ও পরে দুটোই যোগ করতে পারেন। বিদ্যমান বিট অ্যারের জন্য :bits অ্যানোটেশনটি ব্যবহার করতে হবে।
let value = <<0b110:3, 0b001:3>>
let new_value = <<0b011:3, value:bits, 0b000:3>>
// -> <<120, 8:size(4)>>
সিনট্যাক্স ব্যবহার করে আমরা ভ্যারিয়েবলে সংরক্ষিত বিট অ্যারে কনক্যাটেনেট করতে পারি। ভিন্ন সাইজের দুটি বিট অ্যারে কনক্যাটেনেট করার সময় :bits অ্যানোটেশনটি ব্যবহার করতে হবে।
let first = <<0b110:3>>
let second = <<0b001:3>>
let concatenated = <<first:bits, second:bits>>
// -> <<49:size(6)>>
বিট অ্যারে থেকে মান পাওয়ার জন্যও প্যাটার্ন ম্যাচিং করা যায়। আপনি যে প্রতিটি ফ্র্যাগমেন্ট ক্যাপচার করতে চান, তার বিট সংখ্যা জানতে হবে, একটি ব্যতিক্রম ছাড়া: অজানা সাইজের বিট অ্যারের উপর প্যাটার্ন ম্যাচ করতে :bits অ্যানোটেশনটি ব্যবহার করা যায়, তবে এটি কেবল শেষ ফ্র্যাগমেন্টের জন্যই ব্যবহার করা যাবে।
let assert <<value:4, rest:bits>> = <<0b01101001:8>>
value == 0b0110
// -> true
বিট অ্যারে তৈরি করতে যে ফরম্যাট ব্যবহার করা হয়েছিল, তার থেকে ভিন্ন ফরম্যাটে সেগুলো প্রিন্ট হতে পারে। বিট অ্যারে শেখার সময় এটি প্রায়ই বিভ্রান্তির সৃষ্টি করে।
ডিফল্টভাবে, বিট অ্যারে ৮ বিটের (এক বাইট) ফ্র্যাগমেন্টে দেখানো হয়, এমনকি আপনি যদি সেগুলো ভিন্ন সাইজের ফ্র্যাগমেন্টে তৈরি করে থাকেন।
<<2011:11>>
// -> <<251, 3:size(3)>>
আপনি যদি এমন একটি বিট অ্যারে তৈরি করেন যা একটি প্রিন্টযোগ্য UTF-8 এনকোডেড স্ট্রিং উপস্থাপন করে, তাহলে Erlang টার্গেট করার সময় echo keyword ব্যবহার করে সেটি একটি স্ট্রিং হিসেবে দেখানো হতে পারে। Gleam অভ্যন্তরীণভাবে স্ট্রিং কীভাবে উপস্থাপন করে, তার একটি ইমপ্লিমেন্টেশন ডিটেইলের কারণে এটি হয়।
<<>>
// -> ""
<<65, 66, 67>>
// -> "ABC"