有没有办法获得 class 的插槽?

Is there a way to get the slots of a class?

我有一个class像这个

(defclass shape ()
 ((color :initform :black)
 (thickness :initform 1)
 (filledp :initform nil)
 (window :initform nil)))

如果我只知道这个 class 的实例,common-lisp 中是否有一个函数如何获取这些插槽的列表?

许多 Common Lisp 实现支持 CLOS 元对象协议。这为 classes、槽和其他 元对象 .

提供了内省操作

在 LispWorks 中,可以直接在包 CL-USER 中访问相应的函数。

CL-USER 139 > (defclass shape ()
                ((color :initform :black)
                 (thickness :initform 1)
                 (filledp :initform nil)
                 (window :initform nil)))
#<STANDARD-CLASS SHAPE 40202910E3>

CL-USER 140 > (mapcar #'slot-definition-name
                      (class-direct-slots (class-of (make-instance 'shape))))
(COLOR THICKNESS FILLEDP WINDOW)

函数 slot-definition-nameclass-direct-slots 由 CLOS 的元对象协议定义,并在许多 Common Lisp 实现中得到支持 - 只是它们所在的包可能不同。例如,在 SBCL 中,您可能会在包 SB-MOP.

中找到它们

从 class 我们可以得到 直接插槽列表 。直接槽是直接为 class 定义的槽,它们不是继承的。如果你想得到所有插槽的列表,那么使用函数 class-slots.

Slot这里的意思是我们得到一个slot definition对象,它描述了slot。要获取槽的名称,您必须使用函数 slot-definition-name.

从槽定义对象中检索名称