LISP ভাষায় স্ট্রিমস এবং ইনপুট/আউটপুট ফাংশনস প্রোগ্রামিংয়ের অত্যন্ত গুরুত্বপূর্ণ অংশ। এগুলির মাধ্যমে প্রোগ্রামটি ফাইল, কনসোল, বা অন্য যেকোনো ডিভাইসে ডেটা পাঠাতে এবং গ্রহণ করতে পারে। LISP-এ স্ট্রিম এবং ইনপুট/আউটপুট ফাংশনস ব্যবহার করে ডেটার প্রবাহ পরিচালনা করা হয়।
এখানে LISP-এ স্ট্রিমস এবং ইনপুট/আউটপুট ফাংশনস সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে।
১. স্ট্রিম (Stream) কী?
LISP-এ স্ট্রিম একটি অবজেক্ট যা ডেটা প্রবাহ (data flow) পরিচালনা করে। স্ট্রিম মূলত ইনপুট বা আউটপুট ডিভাইসের সাথে যোগাযোগের মাধ্যম হিসেবে কাজ করে। LISP এ স্ট্রিমস বিভিন্ন ধরনের হতে পারে, যেমন ফাইল স্ট্রিম, স্ট্যান্ডার্ড ইনপুট (stdin), স্ট্যান্ডার্ড আউটপুট (stdout), এবং স্ট্যান্ডার্ড এরর (stderr)।
- স্ট্রিমের ধরন:
- Input Stream: ডেটা পড়ার জন্য।
- Output Stream: ডেটা লেখার জন্য।
- Bidirectional Stream: ডেটা পড়া এবং লেখা উভয়ের জন্য।
LISP স্ট্রিম ব্যবহার করে বিভিন্ন ধরনের ডেটা প্রবাহ পরিচালনা করা হয়, যেমন কনসোলের মাধ্যমে ডেটা পাঠানো বা গ্রহণ করা, ফাইলের সাথে কাজ করা ইত্যাদি।
২. ইনপুট স্ট্রিমস (Input Streams)
Input Stream এর মাধ্যমে আপনি ডেটা ইনপুট হিসাবে গ্রহণ করতে পারেন। LISP-এ read, read-line এবং read-char ফাংশন ইনপুট স্ট্রিম থেকে ডেটা পড়তে ব্যবহৃত হয়।
উদাহরণ: কনসোল থেকে ইনপুট গ্রহণ করা
(setq user-input (read-line)) ; কনসোল থেকে একটি লাইন ইনপুট নেওয়া
(format t "You entered: ~A" user-input)এখানে, read-line ফাংশন ব্যবহার করে কনসোল থেকে একটি লাইন ইনপুট নেওয়া হয় এবং সেটি পরে format দিয়ে প্রিন্ট করা হয়।
read ফাংশন:
read ফাংশন সাধারণত ফাইল বা স্ট্রিম থেকে সিম্বল বা লিস্ট ধরনের ডেটা পড়তে ব্যবহৃত হয়।
(setq my-list (read)) ; একটি লিস্ট ইনপুট নেওয়া৩. আউটপুট স্ট্রিমস (Output Streams)
Output Stream এর মাধ্যমে আপনি ডেটা আউটপুট হিসাবে পাঠাতে পারেন। LISP-এ print, format, write এবং terpri ফাংশন আউটপুট স্ট্রিমের জন্য ব্যবহৃত হয়।
উদাহরণ: কনসোলের মাধ্যমে আউটপুট পাঠানো
(print "Hello, LISP!") ; আউটপুট: Hello, LISP!এখানে, print ফাংশন কনসোলের মাধ্যমে একটি স্ট্রিং আউটপুট পাঠায়। এটি ডেটা আউটপুট করার জন্য সবচেয়ে সহজ পদ্ধতি।
format ফাংশন:
format ফাংশন আউটপুট করার জন্য অনেক বেশি নমনীয় এবং এতে বিভিন্ন ফরম্যাটিং অপশন ব্যবহার করা যায়।
(format t "The sum of ~A and ~A is ~A" 5 10 (+ 5 10)) ; আউটপুট: The sum of 5 and 10 is 15এখানে, format ফাংশনটি ফরম্যাটিংয়ের মাধ্যমে আউটপুট প্রিন্ট করেছে।
terpri ফাংশন:
terpri ফাংশনটি আউটপুটের পর একটি নতুন লাইন বা লাইন ব্রেক যোগ করে।
(terpri) ; নতুন লাইন যোগ করবে৪. ফাইল ইনপুট/আউটপুট (File Input/Output)
LISP-এ ফাইলের সাথে কাজ করতে স্ট্রিম ব্যবহার করা হয়। আপনি ফাইল থেকে ডেটা পড়তে এবং ফাইলের মধ্যে ডেটা লিখতে পারেন।
ফাইল থেকে ডেটা পড়া:
(setq file-stream (open "input.txt" :direction :input))
(setq file-content (read-line file-stream))
(close file-stream) ; ফাইল বন্ধ করা
(format t "File content: ~A" file-content)এখানে, "input.txt" ফাইল থেকে একটি লাইন পড়া হয়েছে এবং read-line ফাংশন ব্যবহার করা হয়েছে। পরে close ফাংশন দিয়ে ফাইলটি বন্ধ করা হয়েছে।
ফাইলের মধ্যে ডেটা লেখা:
(setq file-stream (open "output.txt" :direction :output))
(format file-stream "Hello, this is written to the file.")
(close file-stream)এখানে, "output.txt" ফাইলের মধ্যে ডেটা লেখা হয়েছে এবং পরে ফাইলটি বন্ধ করা হয়েছে।
৫. স্ট্রিম সম্পর্কিত গুরুত্বপূর্ণ ফাংশনস
LISP-এ স্ট্রিম সম্পর্কিত কিছু গুরুত্বপূর্ণ ফাংশনগুলি নিম্নরূপ:
open: একটি স্ট্রিম খুলতে ব্যবহৃত হয় (ফাইল স্ট্রিম বা অন্য স্ট্রিম)।close: স্ট্রিম বন্ধ করতে ব্যবহৃত হয়।read: ইনপুট স্ট্রিম থেকে একটি ডেটা পড়তে ব্যবহৃত হয়।read-line: একটি লাইন ইনপুট স্ট্রিম থেকে পড়তে ব্যবহৃত হয়।write: আউটপুট স্ট্রিমে ডেটা লিখতে ব্যবহৃত হয়।print: একটি সিম্পল আউটপুট প্রিন্ট করতে ব্যবহৃত হয়।format: আউটপুট স্ট্রিমে ফরম্যাটেড আউটপুট তৈরি করতে ব্যবহৃত হয়।terpri: আউটপুট স্ট্রিমে একটি নতুন লাইন যোগ করতে ব্যবহৃত হয়।
৬. স্ট্রিম ম্যানিপুলেশন (Stream Manipulation)
LISP-এ স্ট্রিম ম্যানিপুলেশন আরও উন্নত কৌশল ব্যবহারের জন্য কিছু অতিরিক্ত পদ্ধতি অফার করে। এগুলির মধ্যে রয়েছে:
peek-char: ইনপুট স্ট্রিম থেকে পরবর্তী ক্যারেক্টার চেক করতে ব্যবহৃত হয়।read-char: একটি একক ক্যারেক্টার ইনপুট স্ট্রিম থেকে পড়তে ব্যবহৃত হয়।with-open-file: ফাইল খুলতে এবং কাজ শেষে স্বয়ংক্রিয়ভাবে বন্ধ করতে ব্যবহৃত হয়।
উদাহরণ:
(with-open-file (stream "example.txt" :direction :output)
(format stream "This is an example file."))এখানে, with-open-file ব্যবহার করে ফাইলটি খুলে এবং কাজ শেষ হলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
সারসংক্ষেপ
LISP-এ স্ট্রিমস এবং ইনপুট/আউটপুট ফাংশনস ব্যবহার করে আপনি ডেটা প্রক্রিয়া, ফাইল ম্যানিপুলেশন, এবং আউটপুট/ইনপুট অপারেশন সহজে পরিচালনা করতে পারেন। এই বৈশিষ্ট্যগুলি LISP-কে অত্যন্ত শক্তিশালী এবং নমনীয় প্রোগ্রামিং ভাষা বানিয়ে তুলেছে। প্রধান কিছু ফাংশন যেমন open, close, read, write, এবং format ব্যবহার করে আপনি বিভিন্ন ধরনের স্ট্রিম অপারেশন করতে পারবেন।
Read more