Справочник по Ada 2005
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, соответствующие литералы перечисления считаются перегруженными. В любом месте текста программы, где встречается перегруженная литерала перечисления, тип литералы перечисления должен быть определим из контекста (см. 8.6).
Динамическая семантика
Выполнение enumeration_type_definition создаёт тип перечисления и его первый подтип, который ограничен базовым диапазоном типа.
При вызове безаргументная функция, связанная с литералой перечисления, возвращает соответствующее значение типа перечисления.
ПРИМЕЧАНИЯ
24 Если литерала перечисления встречается в контексте, который не позволяет определить тип литералы, то квалификация именем типа перечисления является одним из способов разрешения неоднозначности (см. 4.7).
Примеры
Примеры типов и подтипов перечисления:
тип День есть (Пн, Вт, Ср, Чт, Пт, Сб, Вс);
тип Масть есть (Трефы, Бубны, Червы, Пики);
тип Пол есть (М, Ж);
тип Уровень есть (Низкий, Средний, Срочный);
тип Цвет есть (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
тип Свет есть (Красный, Жёлтый, Зелёный); -- Красный и Зелёный перегружены
тип Масть есть (Трефы, Бубны, Червы, Пики);
тип Пол есть (М, Ж);
тип Уровень есть (Низкий, Средний, Срочный);
тип Цвет есть (Белый, Красный, Жёлтый, Зелёный, Синий, Коричневый, Чёрный);
тип Свет есть (Красный, Жёлтый, Зелёный); -- Красный и Зелёный перегружены
тип Шестнадцатеричный есть ('A', 'B', 'C', 'D', 'E', 'F');
тип Смешанный есть ('A', 'B', '*', B, Нет, '?', '%');
тип Смешанный есть ('A', 'B', '*', B, Нет, '?', '%');
подтип БуднийДень есть День диапазон Пн .. Пт;
подтип Козырь есть Масть диапазон Червы .. Пики;
подтип Радуга есть Цвет диапазон Красный .. Синий; -- цвет Красный, а не Свет
подтип Козырь есть Масть диапазон Червы .. Пики;
подтип Радуга есть Цвет диапазон Красный .. Синий; -- цвет Красный, а не Свет