2009-04-12 26 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

クラススロットおよび/またはクラスダイレクトスロット(どちらもCLOS 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))))) 
関連する問題