2009-04-12 17 views
11

Java'nın java.lang.Class sınıfı, belirli bir sınıftaki tüm alanları döndürecek bir getDeclaredFields yöntemine sahiptir. Common Lisp için benzer bir şey var mı? Successful Lisp, Bölüm 10 (http://www.psg.com/~dlamkins/sl/chapter10.html) belgesindeki talimatları denedikten sonra, betimleme, inceleme ve sembol-plist gibi bazı yardımcı fonksiyonlara rastladım. Ama hiçbiri, DeclaredFields'ın yaptıklarını yapmaz.Common Lisp'de sınıf iç gözlemi

cevap

11

Sınıf yuvalarını ve/veya sınıf doğrudan yuvalarını kullanmalısınız (her ikisi de CLOS Metaobject Protocol, MOP). sınıf yuvaları, verilen sınıfta bulunan tüm yuvaları döndürür ve sınıf doğrudan yuvaları, sınıf tanımında tüm yuvaların bildirildiğini döndürür.

Farklı lisp uygulamaları MOP'yi biraz farklı olarak uygular; MOP için tek tip arabirime sahip olmak için closer-mop paketini kullanın.

Örnek:

(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 

Örnek:

(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)))))