Справочник по Ada (Ada 2022)
3.2.1 Объявления типов
Объявление type_declaration объявляет тип и его первый подтип.
Синтаксис
type_declaration ::= full_type_declaration
| incomplete_type_declaration
| private_type_declaration
| private_extension_declaration
| incomplete_type_declaration
| private_type_declaration
| private_extension_declaration
full_type_declaration ::=
type defining_identifier [known_discriminant_part] is type_definition
[aspect_specification];
| task_type_declaration
| protected_type_declaration
type defining_identifier [known_discriminant_part] is type_definition
[aspect_specification];
| task_type_declaration
| protected_type_declaration
type_definition ::=
enumeration_type_definition | integer_type_definition
| real_type_definition | array_type_definition
| record_type_definition | access_type_definition
| derived_type_definition | interface_type_definition
enumeration_type_definition | integer_type_definition
| real_type_definition | array_type_definition
| record_type_definition | access_type_definition
| derived_type_definition | interface_type_definition
Правила легальности
Заданный тип не должен иметь подкомпонента, тип которого является самим заданным типом.
Статическая семантика
Идентификатор defining_identifier объявления типа type_declaration обозначает первый подтип типа. Часть known_discriminant_part, если она есть, определяет дискриминанты типа (см. 3.7). Остальная часть объявления type_declaration определяет оставшиеся характеристики (вида) типа.
Тип, определённый объявлением type_declaration, является именованным типом; такой тип имеет один или более именованных подтипов. Некоторые другие формы объявления также включают определения типов в качестве части объявления объекта. Тип, определённый таким объявлением, является безымянным — он не имеет именованных подтипов. Для целей разъяснения этот документ иногда ссылается на безымянный тип по псевдоимени, написанному курсивом, и использует такие псевдоимена в местах, где синтаксис обычно требует identifier. Для именованного типа, чьим первым подтипом является T, этот документ иногда ссылается на тип T просто как «тип T».
Именованный тип, объявленный в full_type_declaration, или безымянный тип, который определяется access_definition или как часть объявления объекта типа, называется полным типом. Объявление полного типа также объявляет полный вид типа. type_definition, task_definition, protected_definition или access_definition, которые определяют полный тип, называются полным определением типа. Типы, объявленные другими формами type_declaration, не являются отдельными типами; они являются частичным или неполным видом некоторого полного типа.
Определение типа неявно объявляет определённые предопределённые операторы, которые работают с типом в соответствии с классами, к которым принадлежит тип, как указано в 4.5.
Предопределённые типы (например, типы Boolean, Wide_Character, Integer, root_integer и universal_integer) — это типы, определённые в предопределённом пакете библиотеки Standard; этот пакет также включает (неявные) объявления их предопределённых операторов. Пакет Standard описан в A.1.
Динамическая семантика
Выполнение объявления full_type_declaration состоит из выполнения полного определения типа. Каждое выполнение полного определения типа создаёт отдельный тип и его первый подтип.
Примеры
Примеры определений типов:
(Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный)
диапазон 1 .. 72
массив(1 .. 10) из Целого
диапазон 1 .. 72
массив(1 .. 10) из Целого
Примеры объявлений типов:
type Цвет is (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
type Столбец is диапазон 1 .. 72;
type Таблица is массив(1 .. 10) из Целого;
type Столбец is диапазон 1 .. 72;
type Таблица is массив(1 .. 10) из Целого;
ПРИМЕЧАНИЕ. Каждый из приведённых выше примеров объявляет именованный тип. Указанный идентификатор обозначает первый подтип типа. Другие именованные подтипы типа могут быть объявлены с помощью subtype_declaration (см. 3.2.2). Хотя имена не обозначают напрямую типы, фраза типа «тип Столбец» иногда используется в этом документе для ссылки на тип Столбец, где Столбец обозначает первый подтип типа. Для примера определения безымянного типа см. объявление массива Color_Table в 3.3.1; его тип является безымянным — он не имеет именованных подтипов.