Во время игры в Лисп я заметил следующее:
(subtypep 'string '(array character)) ==> NIL, T
(subtypep '(array character) 'string) ==> NIL, T
while
(typep (make-string x) '(array character)) ==> T
(typep (make-array x :element-type :character) 'string) ==>T
для любого значения x.
Что означает, что «subtypep» говоритчто 'string и' (символ массива) являются двумя разными типами, в то время как typep говорит, что любой экземпляр одного типа также является экземпляром другого (1)
Если (1) не соответствует действительности - пожалуйста, приведите пример - почему это происходит?Мне трудно понять, потому что я предполагаю, что тип не может концептуально существовать без его экземпляров, то есть он определяется его экземплярами: это класс (в математическом смысле) объектов, которые имеют определенный набор свойств.Это правильно?
РЕДАКТИРОВАТЬ: Как правильно указано, (array character)
не обязательно является подтипом string
по простой причине существования многомерных массивов символов.Но я все еще не могу представить себе экземпляр string
, который не имеет типа (array character)
.