2.15 Пересечение, включение и дизъюнктивность типов



Изображение 2.1: Common Lisp Type Hierarchy by Greg Pfeil

PIC


Common Lisp’овая иерархия типов данных запутана и намеренно оставлена несколько открытой, так что разработчики могут экспериментировать с новыми типами данных в качестве расширения языка. В этом разделе чётко оговариваются все определённые связи между типами, в том числе отношения подтипа/супертипа, непересекаемость и исчерпывающее разбиение. Пользователь Common Lisp’а не должен зависеть от любых отношений, явно здесь не указанных. Например, недопустимо предположить, что, поскольку число это не комплексное и не рациональное, то оно должно быть float. Реализация может содержать другие виды чисел.

В первую очередь нам необходимо определить термины. Если x супертип y, тогда любой объект типа y принадлежит также типу x, и считается, что y подтип x. Если типы x и y не пересекаются, то ни один объект (ни в одно реализации) не может принадлежать одновременно двум этим типам x и y. Типы с a1 по an являются исчерпывающим множеством типа x, если каждый aj является подтипом x, и любой объект обязательно принадлежит одному из типов aj. a1 по an являются исчерпывающим разбиением, если они также попарно не пересекаются.

___________________________________________________________

Обоснование: Может показаться, что real и complex должны формировать исчерпывающее множество типа number. Но это специально сделано не так, для того чтобы расширения Common Lisp’а могли экспериментировать с числовой системой.

___________________________________________________________________________________________________________ ___

Обоснование: Может показаться, что rational и float должны формировать исчерпывающее множество типа real. Но это специально сделано не так, для того чтобы расширения Common Lisp’а могли экспериментировать с числовой системой.

___________________________________________________________________________________________________________ _________

Обоснование: Может показаться, что integer и ratio должны формировать исчерпывающее множество типа rational. Но это специально сделано не так, для того чтобы расширения Common Lisp’а могли экспериментировать с числовой системой.

___________________________________________________________________________________________________________

Types fixnum and bignum do in fact form an exhaustive partition of the type integer; more precisely, they voted to specify that the type bignum is by definition equivalent to (and integer (not fixnum)). This is consistent with the first edition text in section 2.1.1.

I interpret this to mean that implementators could still experiment with such extensions as adding explicit representations of infinity, but such infinities would necessarily be of type bignum.

__________________________________________

Обоснование: The hypothetical name simple-general-vector would have been more accurate than simple-vector, but in this instance euphony and user convenience were deemed more important to the design of Common Lisp than a rigid symmetry.

___________________________________________________________________________________________________________

random-state, readtable, package, pathname, stream, and hash-table попарно не пересекаются с другим типами. Смотрите заметку выше.