Lisp sbcl中的奇怪类优先级列表

Lisp sbcl中的奇怪类优先级列表,lisp,common-lisp,sbcl,clos,mop,Lisp,Common Lisp,Sbcl,Clos,Mop,在sbcl中 *(sb-mop:class-precedence-list (find-class 'cons)) ==>(#<BUILT-IN-CLASS CONS> #<BUILT-IN-CLASS LIST> #<BUILT-IN-CLASS SEQUENCE> #<BUILT-IN-CLASS T>) *(sb mop:类优先级列表(查找类的“cons)) ==>(# # # #) cons从列表继承而不是相反,这不是很奇怪吗?

在sbcl中

*(sb-mop:class-precedence-list (find-class 'cons))
==>(#<BUILT-IN-CLASS CONS> #<BUILT-IN-CLASS LIST> #<BUILT-IN-CLASS SEQUENCE>
 #<BUILT-IN-CLASS T>)
*(sb mop:类优先级列表(查找类的“cons))
==>(# # #
#)

cons从列表继承而不是相反,这不是很奇怪吗?我在这里遗漏了什么?

这是根据。A要么是A,要么是符号NIL(这是类型的唯一对象),这意味着这两种类型都是LIST的专门化,因此它们的等效系统类继承自LIST。

并非所有conse都是LIST(因为最终的cdr可能不是NIL),也并非所有LIST都是conse(如前所述,NIL不是LIST)。所以从技术上讲,两个类都不是属于另一个类的子类。我认为规范是这样写的,因为有人看到了它的实际用途,但我同意它令人困惑,并且可能被误导。

我认为列表的定义包括最后一个单元格的cdr为零的要求……这是非空正确列表的要求。这在列表的链接中有解释。根据正确的公认答案,所有的conse都是列表。它们不一定是合适的列表。