Справочник по Ada (Ada 2022)
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, а подтип результата — базовый подтип типа перечисления.
Каждая литерла перечисления соответствует уникальному значению типа перечисления и уникальному номеру позиции. Номер позиции значения первой перечисленных литерл перечисления равен нулю; номер позиции значения каждой последующей литералы перечисления на единицу больше, чем у предшествующей в списке.
Предопределённые отношения порядка между значениями типа перечисления следуют порядку соответствующих номеров позиций.
Если тот же defining_identifier или defining_character_literal указан более чем в одном enumeration_type_definition, соответствующие литералы перечисления считаются перегруженными. В любом месте программы, где встречается перегруженная литерла перечисления, тип этой литералы должен быть однозначно определяемым из контекста (см. 8.6).
Динамическая семантика
Выполнение enumeration_type_definition создаёт тип перечисления и его первый подтип, который ограничен базовым диапазоном типа.
При вызове безаргументная функция, связанная с литералой перечисления, возвращает соответствующее значение типа перечисления.
ПРИМЕЧАНИЕ Если литерла перечисления встречается в контексте, который не определяет тип литералы, то квалификация именем типа перечисления — один из способов разрешения неоднозначности (см. 4.7).
Примеры
Примеры типов и подтипов перечисления:
type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
type Month_Name is (January, February, March, April, May, June, July,
August, September, October, November, December);
type Suit is (Clubs, Diamonds, Hearts, Spades);
type Gender is (M, F);
type Level is (Low, Medium, Urgent);
type Color is (White, Red, Yellow, Green, Blue, Brown, Black);
type Light is (Red, Amber, Green); -- Red и Green перегружены
type Month_Name is (January, February, March, April, May, June, July,
August, September, October, November, December);
type Suit is (Clubs, Diamonds, Hearts, Spades);
type Gender is (M, F);
type Level is (Low, Medium, Urgent);
type Color is (White, Red, Yellow, Green, Blue, Brown, Black);
type Light is (Red, Amber, Green); -- Red и Green перегружены
type Hexa is ('A', 'B', 'C', 'D', 'E', 'F');
type Mixed is ('A', 'B', '*', B, None, '?', '%');
type Mixed is ('A', 'B', '*', B, None, '?', '%');
subtype Weekday is Day range Mon .. Fri;
subtype Major is Suit range Hearts .. Spades;
subtype Rainbow is Color range Red .. Blue;
-- цвет Красный, а не свет
subtype Major is Suit range Hearts .. Spades;
subtype Rainbow is Color range Red .. Blue;
-- цвет Красный, а не свет