Common lisp 获取类优先级列表时是否取消绑定插槽?

Common lisp 获取类优先级列表时是否取消绑定插槽?,common-lisp,sbcl,clos,mop,Common Lisp,Sbcl,Clos,Mop,为什么我不能在sbcl中获得一个简单的类优先级列表 * (sb-mop::class-precedence-list (find-class 'cons));;works (#<BUILT-IN-CLASS CONS> #<BUILT-IN-CLASS LIST> #<SB-PCL:SYSTEM-CLASS SEQUENCE> #<SB-PCL:SYSTEM-CLASS T>) * (defclass my-class () nil) *

为什么我不能在sbcl中获得一个简单的类优先级列表

* (sb-mop::class-precedence-list (find-class 'cons));;works

(#<BUILT-IN-CLASS CONS> #<BUILT-IN-CLASS LIST> #<SB-PCL:SYSTEM-CLASS SEQUENCE>
 #<SB-PCL:SYSTEM-CLASS T>)
* (defclass my-class ()    nil)
* (sb-mop::class-precedence-list (find-class 'my-class))

debugger invoked on a UNBOUND-SLOT in thread
#<THREAD "main thread" RUNNING {10039CE8D3}>:
  The slot SB-PCL::%CLASS-PRECEDENCE-LIST is unbound in the object
  #<STANDARD-CLASS MY-CLASS>.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [USE-VALUE  ] Return a value as the slot-value.
  1: [STORE-VALUE] Store and return a value as the slot-value.
  2: [ABORT      ] Exit debugger, returning to top level.

((:METHOD SLOT-UNBOUND (T T T)) #<unavailable argument> #<STANDARD-CLASS MY-CLASS> SB-PCL::%CLASS-PRECEDENCE-LIST) [fast-method]
0] 2
*(sb mop::类优先级列表(查找类的“cons”);;作品
(# # #
#)
*(取消我的类()零)
*(sb mop::类优先级列表(查找类“我的类”)
在线程中未绑定的插槽上调用调试器
#:
插槽SB-PCL::%CLASS-Preference-LIST在对象中未绑定
#.
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[使用-VALUE]返回一个值作为插槽值。
1:[存储值]存储并返回一个值作为插槽值。
2:[中止]退出调试器,返回顶层。
(:方法SLOT-UNBOUND(T))##SB-PCL::%CLASS-priority-LIST)[快速方法]
0] 2

课程定稿

根据MOP说明:

类终结是计算类从其超类继承的信息并准备实际分配类实例的过程。类终结过程包括计算类的类优先级列表、类实例中可访问的完整插槽集以及类的完整默认初始化参数集。这些值与类元对象关联,可以通过调用适当的读取器来访问。此外,类终结过程决定如何实现类的实例

为了支持前向引用的超类,并考虑到并非所有类都实际实例化,类终结并不是作为类元对象初始化的一部分来完成的。相反,终结作为一个单独的协议完成,通过调用泛型函数finalize继承来调用。调用finalize继承的确切点取决于类元对象的类;对于标准类,在定义所有类超类之后的某个时间调用它,但不迟于分配类的第一个实例(通过分配实例)时调用

类终结的第一步是计算类优先级列表。首先执行此操作允许后续步骤访问类优先级列表。此步骤通过调用通用函数compute class priority list来执行。此调用返回的值与类元对象关联,可以通过调用类优先级列表泛型函数来访问

示例

* (defclass my-class () nil)

#<STANDARD-CLASS MY-CLASS>
* (sb-mop:class-finalized-p (find-class 'my-class))

NIL
* (sb-mop:finalize-inheritance (find-class 'my-class))

NIL
* (sb-mop:class-finalized-p (find-class 'my-class))

T
* (sb-mop:class-precedence-list (find-class 'my-class))

(#<STANDARD-CLASS MY-CLASS> #<STANDARD-CLASS STANDARD-OBJECT>
 #<SB-PCL::SLOT-CLASS SB-PCL::SLOT-OBJECT> #<SB-PCL:SYSTEM-CLASS T>)
*(defclass my class()nil)
#
*(sb mop:class-p(查找类“我的类”)
无
*(sb mop:完成继承(查找类“我的类”)
无
*(sb mop:class-p(查找类“我的类”)
T
*(sb mop:类优先级列表(查找类“我的类”)
(# #
# #)

创建第一个对象并从其类中获取优先级列表将起作用:
(sb mop:…('my obj的类))