12

我有一堂像这样的课

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

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

4

1 回答 1

21

许多 Common Lisp 实现支持 CLOS元对象协议。这为类、槽和其他元对象提供了内省操作。

在 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-slots.

这里的槽意味着我们得到一个槽定义对象,它描述了槽。要获取插槽的名称,您必须使用函数从插槽定义对象中检索名称slot-definition-name

于 2016-11-22T13:02:22.657 回答