我有一个像这样的类
(defclass shape ()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
如果我只知道这个类的实例,是否有一个common-lisp函数能够获取该类的这些插槽(slot)的列表?
我有一个像这样的类
(defclass shape ()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
如果我只知道这个类的实例,是否有一个common-lisp函数能够获取该类的这些插槽(slot)的列表?
许多通用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-name
和 class-direct-slots
是 CLOS 的元对象协议定义的,并在许多 Common Lisp 实现中得到支持 - 只是它们所在的包可能不同。例如,在 SBCL 中,您可能会在包 SB-MOP
中找到它们。
从一个类中,我们可以获得直接slot列表。 直接 slot 是为该类直接定义且未继承的 slot。 如果您想获取所有 slot 的列表,则使用函数 class-slots
。
Slot 在此处表示我们获得一个slot定义对象,该对象描述了该slot。 要获取slot的名称,您必须使用函数 slot-definition-name
从slot定义对象中检索名称。
(apropos 'slot-definition-name)
来查找这些函数在你的实现中定义在哪些包中。 - coredump
(defclass point (shape) ((x :initform 0) (y :initform 0)))
有没有办法获取它? - Micky