我有一个像这样的课程
(defclass shape ()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
如果我只知道这个类的实例,那么common-lisp中是否有一个函数如何获取这些插槽的列表?
答案 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
从插槽定义对象中检索名称。