Справочное руководство по Ada 2012
3.5.1 Типы перечисления
Определение enumeration_type_definition задаёт тип перечисления.
Синтаксис
enumeration_type_definition ::=
(enumeration_literal_specification {, enumeration_literal_specification})
(enumeration_literal_specification {, enumeration_literal_specification})
Правила легальности
Идентификаторы defining_identifier в верхнем регистре и defining_character_literal в списке enumeration_type_definition должны быть уникальными.
Статическая семантика
Каждое enumeration_literal_specification является явным объявлением соответствующей литералы перечисления: оно объявляет функцию без параметров, имя которой совпадает с defining_identifier или defining_character_literal, и тип результата — базовый тип типа перечисления.
Каждая литерaль перечисления соответствует уникальному значению типа перечисления и уникальному порядковому номеру. Порядковый номер значения первой указанной литерaли перечисления равен нулю; порядковый номер значения каждой последующей литерaли перечисления на единицу больше, чем у предыдущей в списке.
Определённые отношения порядка между значениями типа перечисления соответствуют порядку соответствующих порядковых номеров.
Если один и тот же defining_identifier или defining_character_literal указан в нескольких определениях enumeration_type_definition, соответствующие литерaли перечисления считаются перегруженными. В любом месте текста программы, где встречается перегруженная литерaль перечисления, тип литерaли перечисления должен быть определим из контекста (см. 8.6).
Динамическая семантика
Выполнение enumeration_type_definition создаёт тип перечисления и его первый подтип, который ограничен базовым диапазоном типа.
При вызове функция, связанная с литерaлью перечисления, возвращает соответствующее значение типа перечисления.
ПРИМЕЧАНИЯ
30 Если литерaль перечисления встречается в контексте, который не позволяет определить тип литерaли, то квалификация именем типа перечисления является одним из способов разрешения неоднозначности (см. 4.7).
Примеры
Примеры типов и подтипов перечисления:
тип День есть (Пн, Вт, Ср, Чт, Пт, Сб, Вс);
тип Масть есть (Трефы, Бубны, Черви, Пики);
тип Пол есть (М, Ж);
тип Уровень есть (Низкий, Средний, Срочный);
тип Цвет есть (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
тип Свет есть (Красный, Жёлтый, Зелёный); -- Красный и Зелёный перегружены
тип Масть есть (Трефы, Бубны, Черви, Пики);
тип Пол есть (М, Ж);
тип Уровень есть (Низкий, Средний, Срочный);
тип Цвет есть (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
тип Свет есть (Красный, Жёлтый, Зелёный); -- Красный и Зелёный перегружены
тип Шестнадцатеричный есть ('A', 'B', 'C', 'D', 'E', 'F');
тип Смешанный есть ('A', 'B', '*', B, Нет, '?', '%');
тип Смешанный есть ('A', 'B', '*', B, Нет, '?', '%');
подтип БуднийДень есть День диапазон Пн .. Пт;
подтип Козырь есть Масть диапазон Черви .. Пики;
подтип Радуга есть Цвет диапазон Красный .. Синий; -- цвет Красный, а не свет
подтип Козырь есть Масть диапазон Черви .. Пики;
подтип Радуга есть Цвет диапазон Красный .. Синий; -- цвет Красный, а не свет