Common Lisp中的类内省

12

Java的java.lang.Class类有一个getDeclaredFields方法,会返回给定类中的所有字段。Common Lisp是否有类似的功能呢?在阅读Successful Lisp第10章的指导后,我发现了一些有用的函数,例如describe、inspect和symbol-plist(http://www.psg.com/~dlamkins/sl/chapter10.html)。但是这些函数都不能像getDeclaredFields那样做。

2个回答

11

您应该使用类插槽和/或类直接插槽(两者都来自于CLOS元对象协议,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)))))

5

这个链接出现了404错误。请"为链接提供上下文"; 目前不要进行负面评价,尽管这个答案可能有一些问题,但我知道还有其他学习MOP(元对象协议)的资源。如果提供一个新的链接和更多信息(也许是关于类似getDeclaredFields的具体内容),我很乐意重新考虑投票。 - lindes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接