我有一堂像这样的课
(defclass shape ()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
如果我只知道此类的实例,common-lisp 中是否有一个函数如何获取这些插槽的列表?
我有一堂像这样的课
(defclass shape ()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
如果我只知道此类的实例,common-lisp 中是否有一个函数如何获取这些插槽的列表?
许多 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-name
和class-direct-slots
由 CLOS 的元对象协议定义,并在许多 Common Lisp 实现中得到支持——只是它们所在的包可能不同。例如,在 SBCL 中,可能会在包中找到它们SB-MOP
。
从一个类中我们可以得到直接槽的列表。直接槽是为该类直接定义的并且不被继承的槽。如果要获取所有插槽的列表,请使用函数class-slots
.
这里的槽意味着我们得到一个槽定义对象,它描述了槽。要获取插槽的名称,您必须使用函数从插槽定义对象中检索名称slot-definition-name
。