Common Lisp中的类内省

时间:2009-04-12 18:18:32

标签: java reflection lisp common-lisp introspection

Java的java.lang.Class类有一个getDeclaredFields方法,它将返回给定类中的所有字段。 Common Lisp有类似的东西吗?在阅读了成功的Lisp第10章(http://www.psg.com/~dlamkins/sl/chapter10.html)中的说明之后,我遇到了一些有用的函数,比如describe,inspect和symbol-plist。但是他们都不会像getDeclaredFields那样做。

2 个答案:

答案 0 :(得分:11)

您应该使用class-slots和/或class-direct-slots(两者都来自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)))))

答案 1 :(得分:6)

我认为你正在寻找MetaObject Protocol for CL