gpt4 book ai didi

common-lisp - 获取类优先列表时未绑定(bind)插槽?

转载 作者:行者123 更新时间:2023-12-04 02:18:45 25 4
gpt4 key购买 nike

为什么我不能在 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

最佳答案

类完成

来自 MOP 描述:

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

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

类终结的第一步是计算类优先级列表。首先执行此操作允许后续步骤访问类优先级列表。此步骤通过调用通用函数 compute-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>)

关于common-lisp - 获取类优先列表时未绑定(bind)插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com