Clojure তে সিকোয়েন্স (sequences) একটি গুরুত্বপূর্ণ কনসেপ্ট, এবং এটি এক ধরনের ফাংশনাল ডেটা স্ট্রাকচার হিসেবে কাজ করে। সিকোয়েন্স API হল একটি সেট ফাংশন যা বিভিন্ন ধরনের ডেটা কাঠামোকে সিকোয়েন্সে রূপান্তর করতে সাহায্য করে, যেমন: লিস্ট, ভেক্টর, সেট, ম্যাপ ইত্যাদি। এই API ব্যবহার করে ডেটা ম্যানিপুলেশন, ট্রান্সফরমেশন এবং ফিল্টার করা খুবই সহজ হয়। এর মধ্যে গুরুত্বপূর্ণ একটি বৈশিষ্ট্য হল Lazy Sequences যা মেমোরি দক্ষ এবং অবজেক্টিভ প্রোগ্রামিংয়ে খুবই কার্যকরী।
Clojure এর সিকোয়েন্স API এমন একটি সুবিধাজনক ফিচার যা বিভিন্ন প্রকারের সংগ্রহকে সিকোয়েন্সের মধ্যে রূপান্তর করতে এবং সেই সিকোয়েন্সের উপাদানগুলোর ওপর বিভিন্ন কার্যকলাপ করতে সাহায্য করে। এই API বেশ কিছু বিল্ট-ইন ফাংশন সরবরাহ করে, যেমন map
, filter
, reduce
, first
, rest
, cons
, ইত্যাদি।
first
: সিকোয়েন্সের প্রথম উপাদান ফেরত দেয়।
(first [1 2 3 4]) ; আউটপুট: 1
rest
: সিকোয়েন্সের প্রথম উপাদান ছাড়া বাকি উপাদানগুলো ফেরত দেয়।
(rest [1 2 3 4]) ; আউটপুট: (2 3 4)
cons
: একটি নতুন উপাদান যুক্ত করে সিকোয়েন্সের শুরুতে।
(cons 0 [1 2 3]) ; আউটপুট: (0 1 2 3)
map
: একটি ফাংশন প্রয়োগ করে সিকোয়েন্সের প্রতিটি উপাদান পরিবর্তন করে।
(map inc [1 2 3 4]) ; আউটপুট: (2 3 4 5)
filter
: একটি শর্ত অনুযায়ী সিকোয়েন্সের উপাদান ফিল্টার করে।
(filter even? [1 2 3 4 5 6]) ; আউটপুট: (2 4 6)
reduce
: সিকোয়েন্সের উপাদানগুলোর ওপর একটি একক অপারেশন প্রয়োগ করে একটি একক মান তৈরি করে।
(reduce + [1 2 3 4]) ; আউটপুট: 10
take
: সিকোয়েন্সের প্রথম n
উপাদান বের করে।
(take 3 [1 2 3 4 5]) ; আউটপুট: (1 2 3)
drop
: সিকোয়েন্সের প্রথম n
উপাদান বাদ দেয়।
(drop 2 [1 2 3 4 5]) ; আউটপুট: (3 4 5)
Lazy sequences হল এমন সিকোয়েন্স যা শুধু তখনই মূল্যায়ন (evaluation) হয় যখন তাদের উপাদানগুলো প্রয়োজন পড়ে। সাধারণভাবে, Clojure-এ সিকোয়েন্সগুলোর উপর কোনো অপারেশন সম্পাদন করলে পুরো সিকোয়েন্স তৈরি হয়ে যায়, তবে লেজি সিকোয়েন্সের ক্ষেত্রে শুধুমাত্র প্রয়োজনীয় উপাদানগুলোর উপর অপারেশন চালানো হয় এবং শুধুমাত্র তাদের হিসেবেই মূল্যায়ন করা হয়। এতে মেমোরি সাশ্রয় হয় এবং বড় সিকোয়েন্সের ক্ষেত্রে এটি কার্যকরী।
range
: লেজি সিকোয়েন্স তৈরি করতে range
ফাংশন ব্যবহার করা হয়। এটি একটি ইনফিনিট সিকোয়েন্স তৈরি করে, কিন্তু আপনি যদি শুধুমাত্র কিছু উপাদান প্রয়োজন করেন, তবে Clojure শুধুমাত্র সেগুলো মূল্যায়ন করবে।
(take 5 (range)) ; আউটপুট: (0 1 2 3 4)
lazy-seq
: lazy-seq
ফাংশন ব্যবহার করে আপনি একটি কাস্টম লেজি সিকোয়েন্স তৈরি করতে পারেন।
(defn fib [a b]
(lazy-seq (cons a (fib b (+ a b)))))
(take 10 (fib 0 1)) ; আউটপুট: (0 1 1 2 3 5 8 13 21 34)
এখানে, fib
একটি লেজি সিকোয়েন্স তৈরি করে যা ফিবোনাচ্চি সিরিজের পরবর্তী সংখ্যা উৎপন্ন করে। lazy-seq
নিশ্চিত করে যে পরবর্তী সংখ্যাটি শুধু তখনই তৈরি হবে যখন তা প্রয়োজন হবে।
range
), যেটি নির্দিষ্ট সংখ্যক উপাদান বের করার সময় পর্যন্ত মেমোরি ব্যবহার করে না।(defn even-squares [n]
(lazy-seq (if (zero? n)
nil
(cons (* n n) (even-squares (- n 2))))))
(take 5 (even-squares 10)) ; আউটপুট: (100 64 36 16 4)
এখানে, even-squares
একটি লেজি সিকোয়েন্স তৈরি করছে যেখানে প্রথম ৫টি সোজা সংখ্যার বর্গ (100, 64, 36, 16, 4) বের করা হয়েছে।
map
, filter
, reduce
) করতে ব্যবহৃত হয়, যা ফাংশনাল প্রোগ্রামিংয়ের মূল অংশ।range
অথবা কাস্টম লেজি সিকোয়েন্স lazy-seq
ব্যবহার করে।Clojure-এ সিকোয়েন্স এবং লেজি সিকোয়েন্সের মাধ্যমে ডেটা ম্যানিপুলেশন কার্যকরী এবং মেমোরি সাশ্রয়ীভাবে করা যায়।
common.read_more