12

Java 的 java.lang.Class 类有一个 getDeclaredFields 方法,它将返回给定类中的所有字段。Common Lisp 有类似的东西吗?在阅读了成功 Lisp 第 10 章 ( http://www.psg.com/~dlamkins/sl/chapter10.html ) 中的说明后,我发现了一些有用的功能,例如描述、检查和符号 plist。但他们都没有做 getDeclaredFields 所做的事情。

4

2 回答 2

11

您应该使用 class-slots 和/或 class-direct-slots(两者都来自 CLOS Metaobject Protocol,MOP)。class-slots 返回给定类中存在的所有插槽,而 class-direct-slots 返回在类定义中声明的所有插槽。

不同的 lisp 实现对 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)))))
于 2009-04-12T19:40:13.070 回答
5

我认为您正在寻找CL 的 MetaObject 协议

于 2009-04-12T18:27:54.727 回答