2009-04-12 24 views
11

जावा की java.lang.Class क्लास में एक getDeclaredFields विधि है जो किसी दिए गए वर्ग में सभी फ़ील्ड लौटाएगी। क्या आम लिस्प के लिए कुछ समान है? सफल लिस्प में अध्याय 10 (http://www.psg.com/~dlamkins/sl/chapter10.html) में निर्देशों को पढ़ने के बाद वर्णन, निरीक्षण और प्रतीकात्मक रूप से कुछ उपयोगी कार्यों में आया। लेकिन उनमें से कोई भी नहीं मिलता है जो प्राप्त करता है।सामान्य लिस्प में कक्षा आत्मनिरीक्षण

उत्तर

11

आपको कक्षा-स्लॉट और/या क्लास-डायरेक्ट-स्लॉट का उपयोग करना चाहिए (दोनों CLOS मेटाबोजेक्ट प्रोटोकॉल, एमओपी से हैं)। क्लास स्लॉट दिए गए वर्ग में मौजूद सभी स्लॉट लौटाते हैं, और क्लास-डायरेक्ट-स्लॉट रिटर्न सभी स्लॉट कक्षा परिभाषा में घोषित किए जाते हैं।

विभिन्न लिस्प कार्यान्वयन एमओपी को थोड़ा अलग तरीके से कार्यान्वित करते हैं; एमओपी के लिए एक समान इंटरफ़ेस रखने के लिए closer-mop पैकेज का उपयोग करें।

उदाहरण:

(defclass foo() 
    (foo-x)) 

(finalize-inheritance (find-class 'foo)) ;this is needed to be able to query class slots and other properties. Or, class is automatically finalized when its first instance is created 

(class-slots (find-class 'foo)) 
=> (#<STANDARD-EFFECTIVE-SLOT-DEFINITION FOO-X>) 

(slot-definition-name (first (class-slots (find-class 'foo)))) 
=> FOO-X 

उदाहरण:

(defun inspect ((object standard-object)) 
    (inspect-rec (class-slots (class-of object)) object)) 


(defun inspect-rec (slots o) 
    (if(atom slots)() 
    (let ((sn (slot-definition-name (car slots)))) (cons (list sn '=> (slot-value o sn)) (inspect-rec (cdr slots) o))))) 
संबंधित मुद्दे