2009-04-12 4 views
11

Java의 java.lang.Class 클래스에는 주어진 클래스의 모든 필드를 반환하는 getDeclaredFields 메소드가 있습니다. Common Lisp과 비슷한 것이 있습니까? 필자는 Successful Lisp, Chapter 10 (http://www.psg.com/~dlamkins/sl/chapter10.html)에있는 지침을 읽은 후 설명, 검사 및 기호 plist와 같은 유용한 기능을 발견했습니다. 그러나 getDeclaredFields가하는 일은 그들 중 누구도하지 않습니다.Common Lisp의 클래스 내성 검사

답변

11

클래스 슬롯 및/또는 클래스 다이렉트 슬롯 (둘 다 CLOP Metaobject Protocol, MOP에서 제공)을 사용해야합니다. class-slots은 주어진 클래스에 존재하는 모든 슬롯을 반환하고, class-direct-slots은 클래스 정의에서 모든 슬롯을 반환합니다.

다른 lisp 구현은 MOP를 약간 다르게 구현합니다. closer-mop 패키지를 사용하여 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)))))