LISP - CLOS
आम एलआईएसपी ने कुछ दशकों के दौरान ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को आगे बढ़ाया। हालाँकि, इसे ऑब्जेक्ट-ओरिएंटेशन बाद के चरण में शामिल किया गया था।
परिभाषित करने वाली कक्षाएं
defclassमैक्रो उपयोगकर्ता-परिभाषित कक्षाएं बनाने की अनुमति देता है। यह एक वर्ग को डेटा प्रकार के रूप में स्थापित करता है। इसके निम्नलिखित सिंटैक्स हैं -
(defclass class-name (superclass-name*)
(slot-description*)
class-option*))
स्लॉट वैरिएबल होते हैं जो डेटा, या फ़ील्ड्स को स्टोर करते हैं।
एक स्लॉट-विवरण में फॉर्म (स्लॉट-नाम स्लॉट-विकल्प *) होता है, जहां प्रत्येक विकल्प एक कीवर्ड होता है, जिसके बाद एक नाम, अभिव्यक्ति और अन्य विकल्प होते हैं। सबसे अधिक इस्तेमाल किया स्लॉट विकल्प हैं -
:accessor समारोह के नाम
:initform अभिव्यक्ति
:initarg प्रतीक
उदाहरण के लिए, आइए एक बॉक्स क्लास को परिभाषित करें, जिसमें तीन स्लॉट्स की लंबाई, चौड़ाई और ऊँचाई हो।
(defclass Box ()
(length
breadth
height)
)
एक खांचे तक पहुंच और पढ़ना / नियंत्रण प्रदान करना
जब तक स्लॉट में ऐसे मान नहीं होते जिन्हें एक्सेस किया जा सकता है, पढ़ा या लिखा जा सकता है, कक्षाएं बहुत बेकार हैं।
आप निर्दिष्ट कर सकते हैं accessorsप्रत्येक स्लॉट के लिए जब आप एक वर्ग को परिभाषित करते हैं। उदाहरण के लिए, हमारी बॉक्स क्लास लें -
(defclass Box ()
((length :accessor length)
(breadth :accessor breadth)
(height :accessor height)
)
)
आप अलग से भी निर्दिष्ट कर सकते हैं accessor एक स्लॉट पढ़ने और लिखने के लिए नाम।
(defclass Box ()
((length :reader get-length :writer set-length)
(breadth :reader get-breadth :writer set-breadth)
(height :reader get-height :writer set-height)
)
)
एक कक्षा का उदाहरण बनाना
सामान्य कार्य make-instance एक वर्ग का एक नया उदाहरण बनाता है और देता है।
इसके निम्नलिखित सिंटैक्स हैं -
(make-instance class {initarg value}*)
उदाहरण
हम तीन स्लॉट, लंबाई, चौड़ाई और ऊंचाई के साथ एक बॉक्स क्लास बनाते हैं। हम इन क्षेत्रों में मान सेट करने के लिए तीन स्लॉट एक्सेसरों का उपयोग करेंगे।
Main.lisp नाम से एक नया सोर्स कोड फ़ाइल बनाएँ और उसमें निम्न कोड टाइप करें।
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
)
)
(setf item (make-instance 'box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
(format t "Length of the Box is ~d~%" (box-length item))
(format t "Breadth of the Box is ~d~%" (box-breadth item))
(format t "Height of the Box is ~d~%" (box-height item))
जब आप कोड निष्पादित करते हैं, तो यह निम्न परिणाम देता है -
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
कक्षा पद्धति को परिभाषित करना
defmethodमैक्रो आपको कक्षा के अंदर एक विधि को परिभाषित करने की अनुमति देता है। निम्नलिखित उदाहरण हमारे बॉक्स वर्ग का विस्तार करता है जिसमें मात्रा नाम की एक विधि शामिल है।
Main.lisp नाम से एक नया सोर्स कोड फ़ाइल बनाएँ और उसमें निम्न कोड टाइप करें।
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
(volume :reader volume)
)
)
; method calculating volume
(defmethod volume ((object box))
(* (box-length object) (box-breadth object)(box-height object))
)
;setting the values
(setf item (make-instance 'box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
; displaying values
(format t "Length of the Box is ~d~%" (box-length item))
(format t "Breadth of the Box is ~d~%" (box-breadth item))
(format t "Height of the Box is ~d~%" (box-height item))
(format t "Volume of the Box is ~d~%" (volume item))
जब आप कोड निष्पादित करते हैं, तो यह निम्न परिणाम देता है -
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Volume of the Box is 500
विरासत
LISP आपको किसी वस्तु को दूसरी वस्तु के संदर्भ में परिभाषित करने की अनुमति देता है। यह कहा जाता हैinheritance.आप नई या अलग-अलग विशेषताओं को जोड़कर एक व्युत्पन्न वर्ग बना सकते हैं। व्युत्पन्न वर्ग को मूल वर्ग की कार्यात्मकता विरासत में मिलती है।
निम्नलिखित उदाहरण यह बताते हैं -
उदाहरण
Main.lisp नाम से एक नया सोर्स कोड फ़ाइल बनाएँ और उसमें निम्न कोड टाइप करें।
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
(volume :reader volume)
)
)
; method calculating volume
(defmethod volume ((object box))
(* (box-length object) (box-breadth object)(box-height object))
)
;wooden-box class inherits the box class
(defclass wooden-box (box)
((price :accessor box-price)))
;setting the values
(setf item (make-instance 'wooden-box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
(setf (box-price item) 1000)
; displaying values
(format t "Length of the Wooden Box is ~d~%" (box-length item))
(format t "Breadth of the Wooden Box is ~d~%" (box-breadth item))
(format t "Height of the Wooden Box is ~d~%" (box-height item))
(format t "Volume of the Wooden Box is ~d~%" (volume item))
(format t "Price of the Wooden Box is ~d~%" (box-price item))
जब आप कोड निष्पादित करते हैं, तो यह निम्न परिणाम देता है -
Length of the Wooden Box is 10
Breadth of the Wooden Box is 10
Height of the Wooden Box is 5
Volume of the Wooden Box is 500
Price of the Wooden Box is 1000