আমরা যে ভাষাটি ব্যবহার করছি তার নাম Lisp, যা LIST Processing-এর সংক্ষিপ্ত রূপ। তাই কেউ ধরে নিতেই পারেন যে এই ভাষায় আইটেমের লিস্ট সামলানোর সুবিধা আছে, এবং আপনি একেবারে ঠিকই ধরেছেন!
Common Lisp-এ লিস্ট ছাড়াও অন্য ডেটা স্ট্রাকচার থাকলেও, লিস্টের ব্যবহার এখনও অনেক বেশি।
Common Lisp-এ একটি লিস্ট হলো আইটেমের একটি সিকোয়েন্স। এটিকে কনস-ও বলা হয় (বেশিরভাগই ঐতিহাসিক কারণে)।
আইটেমগুলো একই টাইপের হতে হয় না।
যেমন 1, two, "III" দিয়ে গঠিত একটি লিস্ট থাকতে পারে।
আপনি এভাবে একটি কোটেড লিস্ট টাইপ করতে পারেন: '(1 two "III"), আর এতে একটি লিস্ট তৈরি ও ইভ্যালুয়েট হবে (এটি ইভ্যালুয়েট হয়ে (1 two "III") হয়)।
লিস্ট তৈরিতে ব্যবহৃত দুটি প্রধান ফাংশনও আছে: list এবং cons।
list শূন্য বা তার বেশি আর্গুমেন্ট নেয় এবং সেই মানগুলো দিয়ে তৈরি একটি লিস্টে ইভ্যালুয়েট হয়:
(list 1 'two "III") ; => (1 two "III")
cons দুটি আইটেম নেয় এবং এমন একটি লিস্ট তৈরি করে যার প্রথম আইটেমটি হয় তার car (লিস্টের হেড) এবং দ্বিতীয় আইটেমটি হয় তার cdr (লিস্টের বাকি অংশ):
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
car ও cdr ফাংশন দিয়ে একটি লিস্টের car ও cdr অ্যাক্সেস করা যায়।
(first ও rest হলো car ও cdr-এর সমার্থক এবং এগুলো ঠিক একইভাবে কাজ করে।)
length ব্যবহার করে একটি লিস্টের দৈর্ঘ্য নির্ণয় করা যায়।
একটি খালি লিস্টের দৈর্ঘ্য শূন্য।
nth দিয়ে যেকোনো আইটেম অ্যাক্সেস করা যায় (মনে রাখবেন, লিস্ট জিরো-ইনডেক্সড)।
লিস্টের দৈর্ঘ্যের চেয়ে বড় একটি ইনডেক্স চাওয়া কোনো এরর নয়।
বরং এটি ইভ্যালুয়েট হয়ে nil হয়:
(nth 23 '(short list)) ; => nil
লিস্টের প্রথম কয়েকটি আইটেম অ্যাক্সেস করার জন্য আরও কিছু হেল্পার মেথডও আছে: first, second, third, এভাবে tenth পর্যন্ত। দারুণ, তাই না?
append দিয়ে দুই বা ততোধিক লিস্ট একত্র করা যায়:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
append-কে দেওয়া প্রতিটি আর্গুমেন্ট অবশ্যই একটি লিস্ট হতে হবে।
Lisp এলিয়েন Leslie-র কিছু কেনাকাটা করতে হবে। একটি শপিং লিস্ট থাকা খুবই জরুরি। সেখানে জিনিস যোগ করতে হয়, আবার জিনিস বাদও দিতে হয়।
অবশ্যই একটি Lisp এলিয়েনের জন্য সাধারণ কলম-কাগজে চলবে না। "List" তো "Lisp" শব্দের প্রায় পুরোটাই জুড়ে আছে!
কেনাকাটার হিসাব রাখতে সাহায্য করার জন্য কিছু ফাংশন লিখতে হবে।
আপনি কি Leslie-কে শপিং লিস্টের হিসাব রাখতে সাহায্য করতে পারেন?
প্রথমেই Leslie-কে একটি খালি লিস্ট তৈরি করতে হবে। সেজন্য new-list নামের একটি ফাংশন একেবারে মানানসই হবে।
(new-list) ; => ()
ওরে বাবা... Leslie-র মাথায় আগে থেকেই কয়েকটা জিনিস আছে, তাই এমন একটি ফাংশন দরকার যা তিনটি জিনিস নেয় (ভাগ্যক্রমে Leslie শুধু তিনটি জিনিসেরই একটি লিস্ট বানায়। একটাও কম নয়, একটাও বেশি নয়!) এবং সেই জিনিসগুলো দিয়ে একটি নতুন শপিং লিস্ট তৈরি করে। একটি ফাংশন লিখুন, list-of-things, যা তিনটি জিনিস নেয় এবং সেগুলোর একটি লিস্ট রিটার্ন করে।
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
দোকানে যাওয়ার আগে Leslie খাবার রাখার ঘরে দেখে নেয় কী কী দরকার। আপনি add-to-list ফাংশনটি লিখে Leslie-কে সাহায্য করুন, যা একটি লিস্টের শুরুতে একটি জিনিস যোগ করে।
(add-to-list 'butter '(bread)) ; => '(butter bread)
কেনাকাটার সময় Leslie জানতে চায় এরপর কী কী খুঁজতে হবে। Leslie আরও ভালোবাসে লিস্টে সামনের দিকে উঁকি দিয়ে দ্বিতীয়, তৃতীয়, এমনকি ২৩তম জিনিসটি (Leslie-র লাকি নম্বর) দেখে নিতে।
first-thing-এর মান হবে লিস্টের প্রথম জিনিসsecond-thing-এর মান হবে দ্বিতীয় জিনিসthird-thing-এর মান হবে তৃতীয় জিনিসtwenty-third-thing-এর মান হবে তেইশতম জিনিস(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie চায় লিস্টের প্রথম জিনিসটি খুঁজে বের করে তা তাক থেকে সরিয়ে ফেলতে। আপনি remove-first-item ফাংশনটি লিখে Leslie-কে সাহায্য করুন, যা ইনপুট লিস্টের প্রথম জিনিসটি ছাড়া বাকি সবকিছু নিয়ে একটি লিস্ট রিটার্ন করে।
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Leslie বুঝতে পারল, ভুল করে একটি নয়, দুটি শপিং লিস্ট তৈরি হয়ে গেছে! একটি ফাংশন লিখুন, list-append, যা প্রথম লিস্টের এলিমেন্টগুলোর পর দ্বিতীয় লিস্টের এলিমেন্টগুলো নিয়ে একটি লিস্ট রিটার্ন করে।
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
এই কেনাকাটার সফরটা বেশ সময় নেবে ভেবে Leslie চিন্তিত হয়ে পড়ছে। লিস্টে আসলে কতগুলো জিনিস আছে? just-how-long নামের একটি ফাংশন লিখুন, যা Leslie-কে জানাবে তার লিস্টটি কত লম্বা।
(just-how-long '(bread milk butter salt)) ; => 4
Exercism-এ সাইন আপ করুন, Common Lisp ট্র্যাকের 27টি কনসেপ্ট92টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।