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

Mic*_*cky 10 class common-lisp clos slots lispworks

我有一个像这样的课

(defclass shape ()
 ((color :initform :black)
 (thickness :initform 1)
 (filledp :initform nil)
 (window :initform nil)))
Run Code Online (Sandbox Code Playgroud)

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

Rai*_*wig 19

许多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)
Run Code Online (Sandbox Code Playgroud)

功能slot-definition-nameclass-direct-slots被用于CLOS元对象协议定义,并在许多Common Lisp的实现都支持-只要他们是可以不同的包装.例如,在SBCL中,可能会在包中找到它们SB-MOP.

从课程中我们可以获得直接插槽列表.直接槽是直接为该类定义的槽,并且不是继承的槽.如果要获取所有插槽的列表,请使用该功能class-slots.

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

  • (mapcar#的sb-mop:slot-definition-name(sb-mop:class-direct-slots(class-of(make-instance'shape))))) (2认同)