获取 class 优先级列表时未绑定插槽?

unbound slot when obtaining class precedence list?

为什么我不能在 sbcl 中获得一个简单的 class-precedence-list?

* (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

Class定稿

来自 MOP 描述:

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

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

class 最终确定的第一步是计算 class 优先级列表。首先执行此操作允许后续步骤访问 class 优先级列表。此步骤通过调用通用函数 compute-class-precedence-list 来执行。此调用返回的值与 class 元对象相关联,可以通过调用 class-precedence-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>)