如何在 Steel Bank Common Lisp (SBCL) 中使用 'class-direct-superclasses' 和 'class-precedence-list'?

How to use `class-direct-superclasses` and `class-precedence-list` in Steel Bank Common Lisp (SBCL)?

提问人:Pedro Delfino 提问时间:3/8/2022 最后编辑:Pedro Delfino 更新时间:3/10/2022 访问量:83

问:

在诸如此类的教程中,可以简单地使用:

CL-USER> (class-precedence-list (find-class (class-name (class-of 123))))

在 LispWorks 中,它们可以通过默认的 package-use-list 获得,在 Allegro 中,它们可以从 ACLMOP 导出。

但是,如何使用和在SBCL中?class-precedence-listclass-direct-superclasses

Obs.:这个教程有一个关于CLOS的新版本,通过The Common Lisp Cookbook

class package 命名空间 common-lisp clos

评论

2赞 ignis volens 3/8/2022
class-direct-superclasses是CLOS的元对象协议(MOP)的一部分,该协议不是标准化的,因此可能因实现而异。一个很好的起点是 Closer to MOP,它在各种实现之上构建了一个相当标准的 MOP。它在 Quicklisp 中。
1赞 Ehvince 3/9/2022
如果您链接到 Github 上最新的 Cookbook,我会很高兴。
0赞 Pedro Delfino 3/10/2022
@Ehvince,它已被添加到:)。我会阅读较新的版本,我只是先阅读较旧的材料。

答:

0赞 Pedro Delfino 3/8/2022 #1

在 SBCL 中,必须使用包表示法从以下位置导入符号:sb-mop

CL-USER> (sb-mop:class-direct-superclasses (find-class (class-name (class-of 123))))
(#<BUILT-IN-CLASS COMMON-LISP:INTEGER>)

CL-USER> (sb-mop:class-precedence-list (find-class (class-name (class-of 123))))
(#<BUILT-IN-CLASS COMMON-LISP:FIXNUM> #<BUILT-IN-CLASS COMMON-LISP:INTEGER>
 #<BUILT-IN-CLASS COMMON-LISP:RATIONAL> #<BUILT-IN-CLASS COMMON-LISP:REAL>
 #<BUILT-IN-CLASS COMMON-LISP:NUMBER> #<SB-PCL:SYSTEM-CLASS COMMON-LISP:T>)