Странный список приоритетов классов в sbcl
В 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>)
Разве не странно, что минусы наследуют из списка, а не наоборот? Что мне здесь не хватает?
2 ответа
Решение
Это согласно спецификации. LIST - это либо CONS, либо символ NIL (который является единственным объектом типа NULL), что означает, что оба эти типа являются специализациями LIST, и, следовательно, их эквивалентные системные классы наследуются от LIST.
Не все conses являются списками (поскольку конечный cdr может не быть nil), и не все списки являются conses (nil не является списком, как упоминалось ранее). С технической точки зрения, ни один из классов не является подклассом другого. Я думаю, что спецификация написана таким образом, потому что кто-то видел практическое использование, но я согласен, что это сбивает с толку и может быть ошибочным.