सामान्य लिस्प में, संरचनाओं को कठोर और निम्न-स्तर के रिकॉर्ड के रूप में माना जाता है। उनके पास फैंसी गतिशील विशेषताएं नहीं हैं।
संरचनाओं के साथ आप क्या कर सकते हैं एक नई संरचना प्रकार को परिभाषित करना है जो किसी अन्य से प्राप्त होता है। एक विरासत उपलब्ध है।
गतिशील विस्तारशीलता को संभालने के लिए, संरचना का एक संपत्ति सूची स्लॉट जोड़ने का एक सामान्य तरीका है। यहोशू का जवाब देखें।
फिर सामान्य लिस्प ऑब्जेक्ट सिस्टम है, जो एकाधिक विरासत प्रदान करता है और आप रनटाइम पर कक्षाएं बदल सकते हैं। तो आप कक्षा में एक स्लॉट जोड़ सकते हैं और उस वर्ग के उदाहरण खुद को अपडेट कर सकते हैं। आप किसी ऑब्जेक्ट की श्रेणी भी बदल सकते हैं और स्लॉट जोड़े या हटाए जा सकते हैं। फिर भी, आमतौर पर कक्षा के सभी उदाहरणों में स्लॉट का एक ही सेट होगा। फिर, एक देखता है कि एक संपत्ति सूची के साथ एक स्लॉट जोड़ा जा सकता है और विस्तारशीलता के लिए इस्तेमाल किया जा सकता है।
कॉमन लिस्प के लिए अन्य ऑब्जेक्ट सिस्टम हैं, जो आसानी से प्रति-आवृत्ति आधार पर स्लॉट जोड़ सकते हैं। लेकिन आमतौर पर इसका उपयोग करने के लिए बहुत अधिक होता है, क्योंकि वे काफी अधिक शक्तिशाली होते हैं।
CLOS और मेटा-ऑब्जेक्ट प्रोटोकॉल के साथ कोई इसे छिपाने का प्रयास कर सकता है।LispWorks यहाँ मैं उपयोग कर रहा हूँ: हमारी संपत्ति के नाम को स्वीकार SLOT-VALUE
बनाने के लिए
(defmethod set-property ((object property-mixin) key value)
(setf (getf (slot-value object 'plist) key) value))
(defmethod get-property ((object property-mixin) key)
(getf (slot-value object 'plist) key))
अब हम तरीकों लिखें:
(defclass property-mixin()
((plist :initform nil))
#+lispworks
(:optimize-slot-access nil))
सेटिंग और गुण पढ़ने:
हम अपने गुणों के लिए एक mixin वर्ग को परिभाषित :
(defmethod (setf clos:slot-value-using-class)
(value (class standard-class) (object property-mixin) slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(progn
(set-property object slot-name value)
value)))
(defmethod clos:slot-value-using-class ((class standard-class)
(object property-mixin)
slot-name)
(declare (ignorable class))
(if (slot-exists-p object slot-name)
(call-next-method)
(get-property object slot-name)))
उदाहरण।
(defclass automobile (property-mixin)
((company :initarg :company)
(motor :initarg :motor))
#+lispworks
(:optimize-slot-access nil))
अब एक उदाहरण:: हम दो स्लॉट के साथ एक वाहन वर्ग को परिभाषित
CL-USER 45 > (setf a6 (make-instance 'automobile :company :audi :motor :v6))
#<AUTOMOBILE 402005B47B>
हम एक सामान्य स्लॉट मूल्य प्राप्त कर सकते हैं:
CL-USER 46 > (slot-value c1 'motor)
:V6
के एक स्लॉट जो नहीं है के लिए लिखते हैं मौजूद है, लेकिन हमारी संपत्ति सूची में जोड़ा जाएगा:
CL-USER 47 > (setf (slot-value a6 'seats) 4)
4
हम मूल्य वापस प्राप्त कर सकते:
CL-USER 48 > (slot-value c1 'seats)
4
धन्यवाद, यह लगभग वही है जो मैं ढूंढ रहा हूं। लेकिन संपत्ति सूची रखने का कोई तरीका है, जैसा कि आपने इसे 'नोड' में बस अन्य स्लॉट के रूप में रखा है? दूसरे शब्दों में, '(मेक-नोड' कुछ लेबल करने के लिए कोई तरीका है: एक 1: दो 2) => (कुछ-लेबल: एक 1: दो 2) ', '(कुछ-लेबल (: एक 1: दो दो)) '? –
संक्षेप में, नहीं। [रेनर का जवाब] (http://stackoverflow.com/a/17556349/1281433) सामान्य रूप से संरचनाओं के बारे में अधिक गहराई में जाता है, लेकिन बिंदु यह है कि संरचनाओं में स्लॉट की निश्चित संख्या होती है। भले ही आप '(: प्रकार सूची) 'विकल्प के साथ" खराब व्यक्ति के रिकॉर्ड "बनाने के लिए' defstruct' का उपयोग कर सकते हैं, फिर भी आप केवल स्लॉट की एक निश्चित संख्या प्राप्त करने जा रहे हैं (जिसका अर्थ है कि सूची में निश्चित संख्या है तत्व)। यह वास्तव में लगता है जैसे आप सिर्फ एक संपत्ति सूची चाहते हैं। –
हाँ, रेनर के जवाब के माध्यम से पढ़ना, मुझे लगता है कि मैं जो कर रहा हूं उसके मुकाबले ज्यादा फ़ायरवॉवर है। सलाह के लिए धन्यवाद दोस्तों! –