在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>)
cons从列表继承而不是从列表继承,这不是很奇怪吗?我在这里错过了什么?
这符合规范。LIST要么是CONS,要么是符号NIL(它是NULL类型的唯一对象),这意味着这两种类型都是LIST的特殊化,因此它们的等效系统类继承自LIST。
不是所有的conses都是列表(因为最终cdr可能不是nil),也不是所有的列表都是conses(nil不是列表,如前所述)。所以从技术上讲,两者都不是属于另一个的子类。我认为规范是这样写的,因为有人看到了它的实际用途,但我同意它令人困惑,可能会被误导。