LISP প্রোগ্রামিং ভাষায় Generic Functions এবং Methods একটি অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ বৈশিষ্ট্য, বিশেষত যখন Object-Oriented Programming (OOP) বা CLOS (Common Lisp Object System) ব্যবহৃত হয়। এই কনসেপ্টগুলি মাল্টিপল ডিসপ্যাচ এবং পলিমরফিজম সরবরাহ করে, যেখানে একটি ফাংশন একাধিক ধরনের আর্গুমেন্টের সাথে কাজ করতে পারে এবং সেই আর্গুমেন্টের টাইপ অনুযায়ী আচরণ পরিবর্তন করতে পারে।
এখানে আমরা Generic Functions এবং Methods এর মৌলিক ধারণা, তাদের ব্যবহারের ধরন এবং উদাহরণ নিয়ে আলোচনা করব।
১. Generic Functions (জেনেরিক ফাংশন)
Generic Functions হল এমন ফাংশন যা একাধিক ক্লাসের বিভিন্ন ইনস্ট্যান্সের উপর কাজ করতে পারে এবং সেই ক্লাসের উপর নির্ভর করে তাদের আচরণ পরিবর্তিত হয়। LISP এর CLOS সিস্টেমের মাধ্যমে এটি সম্ভব হয়।
Generic Function হলো একটি সাধারণ ফাংশন, যা একাধিক methods দ্বারা সাপোর্টেড হয়, এবং ইনপুট আর্গুমেন্টের টাইপ বা ক্লাস অনুযায়ী নির্ধারিত method নির্বাচন করে।
Generic Function ডিফাইন করা:
LISP-এ Generic Functions ডিফাইন করতে defgeneric ব্যবহৃত হয়। এটি একটি সাধারণ ফাংশন তৈরি করে যা পরে defmethod দিয়ে নির্দিষ্ট ইনপুট টাইপের জন্য ব্যবহার করা যায়।
উদাহরণ:
(defgeneric area (shape))এখানে:
areaহল একটি generic function, যা কোনও shape এর উপর কাজ করবে।
২. Methods (মেথডস)
Methods হল সেই কোডের ব্লক যা Generic Functions এর সাথে সম্পর্কিত এবং যেগুলি নির্দিষ্ট ইনপুট ক্লাস বা টাইপের জন্য নির্ধারিত হয়। Methods ফাংশনের আচরণ নির্ধারণ করে। একটি generic function একাধিক method নিয়ে কাজ করতে পারে, এবং method গুলি ক্লাস বা ইনপুট আর্গুমেন্টের টাইপের ওপর ভিত্তি করে পৃথক পৃথক কাজ করতে পারে।
Method ডিফাইন করা:
LISP-এ Methods ডিফাইন করতে defmethod ব্যবহৃত হয়। defmethod এক বা একাধিক ক্লাসের উপর ভিত্তি করে কাজ করার জন্য একটি নির্দিষ্ট ফাংশনের আচরণ সংজ্ঞায়িত করে।
উদাহরণ:
(defmethod area ((shape circle))
(* pi (expt (radius shape) 2)))
(defmethod area ((shape rectangle))
(* (length shape) (width shape)))এখানে:
- দুটি method তৈরি করা হয়েছে, একটি circle ক্লাসের জন্য এবং অন্যটি rectangle ক্লাসের জন্য।
areageneric function দুটি ভিন্ন আর্গুমেন্ট টাইপের (circle এবং rectangle) জন্য আলাদা আচরণ নিয়ে কাজ করবে।
৩. Generic Functions এবং Methods এর ব্যবহার
LISP-এর CLOS (Common Lisp Object System) এ Generic Functions এবং Methods ব্যবহারের উদ্দেশ্য হল কোডের পুনঃব্যবহারযোগ্যতা, স্কেলেবিলিটি এবং মাল্টিপল ডিসপ্যাচ সুবিধা প্রদান করা।
উদাহরণ: বিভিন্ন ধরনের আকারের জন্য Generic Functions এবং Methods ব্যবহার
ধরা যাক, আমরা circle, rectangle, এবং square ক্লাসের জন্য একটি area generic function তৈরি করতে চাই।
- ক্লাস ডিফাইন করা:
```lisp
(defclass circle ()
((radius :initarg :radius :accessor radius)))
(defclass rectangle ()
((length :initarg :length :accessor length)
(width :initarg :width :accessor width)))
(defclass square (rectangle) ())
এখানে:
- আমরা তিনটি ক্লাস তৈরি করেছি: **circle**, **rectangle**, এবং **square**।
2. **Generic Function ডিফাইন করা**:
```lisp
(defgeneric area (shape))এখানে:
areaএকটি generic function যা shape নামক আর্গুমেন্ট নেবে এবং তার উপর নির্ভর করে method নির্বাচন করবে।
- Methods ডিফাইন করা:
```lisp
(defmethod area ((shape circle))
(* pi (expt (radius shape) 2)))
(defmethod area ((shape rectangle))
(* (length shape) (width shape)))
(defmethod area ((shape square))
(area (make-instance 'rectangle :length (length shape) :width (width shape))))
এখানে:
- **`area`** generic function এর জন্য আলাদা **method** তৈরি করা হয়েছে `circle`, `rectangle`, এবং `square` ক্লাসের জন্য।
4. **ব্যবহার**:
```lisp
(let ((c (make-instance 'circle :radius 3))
(r (make-instance 'rectangle :length 4 :width 5))
(s (make-instance 'square :length 4 :width 4)))
(print (area c)) ; আউটপুট: 28.2743
(print (area r)) ; আউটপুট: 20
(print (area s))) ; আউটপুট: 20এখানে:
areageneric function নির্দিষ্ট ক্লাসের method অনুসারে কাজ করছে এবং ভিন্ন ভিন্ন আর্গুমেন্টের জন্য ভিন্ন আউটপুট প্রদান করছে।
৪. Multiple Dispatch (মাল্টিপল ডিসপ্যাচ)
LISP-এর Generic Functions multiple dispatch সমর্থন করে, অর্থাৎ একই ফাংশন একাধিক ইনপুট টাইপের উপর ভিত্তি করে আলাদা আচরণ করে। এর ফলে, কোড আরও নমনীয় এবং ভিন্ন ভিন্ন ডেটা টাইপের জন্য একই ফাংশন একাধিক কাজ করতে সক্ষম হয়।
উদাহরণ:
ধরা যাক, আমরা add নামক একটি ফাংশন তৈরি করতে চাই যা দুটি ইনপুটের ধরণ অনুসারে ভিন্ন আচরণ করবে।
(defgeneric add (x y))
(defmethod add ((x integer) (y integer))
(+ x y))
(defmethod add ((x string) (y string))
(concatenate 'string x y))এখানে:
addgeneric function দুটি ইনপুটের ধরণ অনুযায়ী ভিন্ন ভিন্ন method দিয়ে কাজ করবে। যদি ইনপুটintegerহয়, তাহলে যোগফল করবে, এবং যদি ইনপুটstringহয়, তাহলে concatenation করবে।
সারসংক্ষেপ
- Generic Functions LISP-এ এমন ফাংশন যা একাধিক ধরনের ইনপুটের জন্য বিভিন্ন methods গ্রহণ করে এবং সেই ইনপুটের টাইপ অনুযায়ী কাজ করে।
- Methods হল সেই কোডের অংশ যা generic functions এর জন্য নির্দিষ্ট ইনপুট ক্লাস বা টাইপের জন্য আচরণ নির্ধারণ করে।
- LISP-এর CLOS সিস্টেমের মাধ্যমে polymorphism এবং multiple dispatch সহজে পরিচালনা করা যায়, যেখানে একটি ফাংশন একাধিক আর্গুমেন্ট টাইপের জন্য আলাদা আচরণ করতে পারে।
এই কৌশলগুলি OOP এর মতো একটি শক্তিশালী এবং নমনীয় ডেভেলপমেন্ট প্যাটার্ন তৈরি করতে সাহায্য করে, যা কোডের পুনঃব্যবহারযোগ্যতা এবং স্কেলেবিলিটি বৃদ্ধি করে।
Read more