#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. Согласно принятому правильному ответу, все значения являются списками. Они просто не обязательно являются правильными списками.