Справочник по Ada 95
3.5.1 Типы перечислений
Определение enumeration_type_definition задаёт тип перечисления.
Синтаксис
enumeration_type_definition ::=
(enumeration_literal_specification {, enumeration_literal_specification})
(enumeration_literal_specification {, enumeration_literal_specification})
enumeration_literal_specification ::= defining_identifier | defining_character_literal
defining_character_literal ::= character_literal
Правила допустимости
Идентификаторы 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 создаётся тип перечисления и его первый подтип, который ограничен базовым диапазоном типа.
При вызове безаргументная функция, связанная с литерой перечисления, возвращает соответствующее значение типа перечисления.
ПРИМЕЧАНИЯ
22 Если литерла перечисления встречается в контексте, который не определяет тип литерлы, то квалификация именем типа перечисления — один из способов разрешения неоднозначности (см. 4.7).
Примеры
Примеры типов и подтипов перечисления:
type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
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 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; -- цвет Красный, а не свет