有没有办法获得课程的插槽?

时间:2016-11-22 12:36:57

标签: class common-lisp slots clos lispworks

我有一个像这样的课程

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

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

1 个答案:

答案 0 :(得分:17)

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

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

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-name由CLOS的元对象协议定义,并且在许多Common Lisp实现中都受支持 - 只是它们所在的包可能不同。例如,在SBCL中,可以在包class-direct-slots中找到它们。

从课程中我们可以获得直接插槽的列表。直接槽是直接为该类定义的槽,并且不是继承的槽。如果要获取所有插槽的列表,请使用函数SB-MOP

这里的

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