Странный список приоритетов классов в sbcl

#lisp #common-lisp #sbcl #clos #mop

#lisp #common-lisp #sbcl #закрытие #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>)
  

Не странно ли, что cons наследуется от list, а не наоборот? Чего я здесь не понимаю?

Ответ №1:

Это соответствует спецификации. СПИСОК — это либо CONS, либо символ NIL (который является единственным объектом типа NULL), что означает, что оба этих типа являются специализациями LIST , и, следовательно, их эквивалентные системные классы наследуются от LIST.

Комментарии:

1. Я думал, что определение списка включает требование, чтобы cdr последней ячейки был равен нулю…

2. Это требование для непустого правильного списка. Это объясняется в ссылке для СПИСКА.

Ответ №2:

Не все conse являются списками (поскольку конечный cdr может быть не равен нулю), и не все списки являются conse (nil — это не список, как упоминалось ранее). Итак, технически говоря, ни один из них не относится к классу, который по сути является подклассом другого. Я думаю, что спецификация написана таким образом, потому что кто-то увидел практическое применение, но я согласен, что это сбивает с толку и может вводить в заблуждение.

Комментарии:

1. Согласно принятому правильному ответу, все значения являются списками. Они просто не обязательно являются правильными списками.