Описание производного типа неявно описывает в этом месте каждую операцию над производным типом. Неявные описания любых производных подпрограмм следуют за описанием производного типа.
Спецификация производной подпрограммы неявно получается систематическим замещением родительского типа на производный тип в спецификации наследуемой подпрограммы. Любой подтип родительского типа подобным образом замещается подтипом производного типа с аналогичными ограничениями (как при замене ограничения родительского подтипа на соответствующее ограничение производного подтипа). Наконец, любое выражение родительского типа становится операндом преобразования типа, которое вырабатывает результат производного типа.
Вызов производной подпрограммы эквивалентен вызову соответствующей подпрограммы родительского типа, в котором каждый фактический параметр производного типа заменяется преобразованием типа этого фактического параметра к родительскому типу (это означает, что преобразование к родительскому типу происходит перед вызовом параметров вида in и in out; обратное преобразование к производному типу происходит после вызова параметров вида in out и out, см. 6.4.1). Дополнительно, если результат вызванной функции имеет родительский тип, то он преобразуется к производному типу.
Если производный тип или личный тип описаны непосредственно в видимом разделе пакета, то в этом разделе этот тип не должен использоваться как родительский'тип в определении производного типа (для личных типов см. также разд. 7.4.1).
При предвыполнении определения производного типа сначала предвы- полняется указание подтипа, затем создается производный тип, а затем — производный подтип.
Примеры:
type ЛОКАЛЬНАЯ-КООРДИНАТА is new КООРДИНАТА; - - два различных типа type СЕРЕДИНА-НЕДЕЛИ is new ДЕНЬ range ВТР . . ЧТВ; - - см. 3.5.1 type СЧЕТЧИК is new POSITIVE; - - тот же диапазон, что и POSITIVE type СПЕЦИАЛЬНЫЙКЛЮЧ is new УПРАВЛЕНИЕ_ПО_КЛЮЧУ . КЛЮЧ;
- - см. 7.4.2
- Производные подпрограммы имеют следующие спецификации:
- procedure ДАЙ_КЛЮЧ (К: out СПЕЦИАЛЬНЫЙ_КЛЮЧ) ;
- function (X, У; СПЕЦИАЛЬНЫЙ_КЛЮЧ) return BOOLEAN;
Примечание. Из правил наследования базовых операций и литералов перечисления следует, что обозначения для литерала или агрегата производного типа те же самые, что и для родительского типа; такие литералы и агрегаты называются совмещенными. Из правил также следует, что обозначения компонента, дискриминанта, входа, отрезка или атрибута одинаковы для производного и родительского типов.
Скрытие производной подпрограммы допустимо даже в одной и той же зоне описания (см. 8.3). Производная подпрограмма скрывает предопределенную операцию, имеющую тот же профиль типа параметра и результата (см. 6.6).
Описание настраиваемой подпрограммы не наследуется, поскольку оно описывает настраиваемый модуль, а не подпрограмму. С другой стороны, конкретизация настраиваемой подпрограммы является (ненастраиваемой) подпрограммой, которая является наследуемой, если она удовлетворяет требованиям наследуемости подпрограмм.
Если родительский тип является логическим, то предопределенные операции отношения над производным типом дают результаты предопределенного типа BOOLEAN (см. 4.5.2).
Если спецификатор представления дан для родительского типа и помещен за описанием производного типа, то соответствующий спецификатор представления неприменим к производному типу; следовательно, для такого производного типа допускается явный спецификатор представления.
Если параметр производной подпрограммы принадлежит производному типу, подтип этого параметра не обязан иметь некоторое значение, общее со значением производного подтипа.
3.5. Скалярные типы
Под скалярными типами подразумеваются перечислимые, целые и вещественные типы. Перечислимые и целые типы называются дискретными типами; каждое значение дискретного типа имеет номер позиции — целое значение. Целые и вещественные типы называются числовыми типами. Все скалярные типы упорядочены, т. е. для их значений предопределены все операции отношения.
ограничение_диапазона : : = range диапазон
диапазон : : = атрибут ^диапазона
I простое_выражение .. простое_выражение
Диапазон определяет подмножество значений скалярного типа. Диапазон Л . . П определяет значения от Л до П включительно, если истинно отношение Л <= П. Значения Л и П называются соответственно нижней границей и верхней границей диапазона. Значение X удовлетворяет ограничению диапазона, если оно принадлежит диапазону; говорят, что значение X принадлежит диапазону, если одновременно истинны отношения Л <= X и X <= П. Пустой диапазон — это диапазон, для которого истинно отношение П < Л; пустому диапазону не принадлежит никакое значение. Операции <= и < в вышеприведенных определениях являются предопределенными операциями над скалярными типами.
Если ограничение диапазона используется в указании подтипа, либо непосредственно, либо как часть ограничения плавающего или фиксированного типа, тип простых выражений (а также границ атрибута диапазона) должен быть тем же, что и базовый тип обозначения типа указания подтипа. Ограничение диапазона совместимо с подтипом, если каждая граница диапазона принадлежит подтипу или если ограничение диапазона определяет пустой диапазон; иначе ограничение диапазона не совместимо с подтипом.
Предвыполнение ограничения диапазона состоит из вычисления диапа1- зона. Вычисление диапазона определяет его нижнюю и верхнюю границы. Если границы заданы простыми выражениями, вычисление диапазона вычисляет эти выражения в порядке, который не определен в языке.
Атрибуты.
Для любого скалярного типа Т или для любого подтипа Т скалярного типа определены следующие атрибуты:
T'FIRST Вырабатывает значение нижней границы Т. Значение этого атрибута имеет тип Т;
T'LAST Вырабатывает значение верхней границы Т. Значение этого атрибута имеет тип Т.
Примечание. Индексирование и правила итерации используют значения дискретных типов.
Перечислимые типы
Определение перечислимого типа задает перечислимый тип.
определение_перечислимого_типа : : =
(спецификация_литерала_перечисления
<, спецификация_литерала_перечисления})
спецификациялитерала_перечисления : : =
литерал_перечисления
литерал-перечисления : : =
идентификатор | символьный_литерал
Идентификаторы и символьные литералы, перечисленные в определении перечислимого типа, должны быть различными. Каждая спецификация литерала перечисления является его описанием: это описание эквивалентно описанию функции без параметров, обозначение которой — этот литерал перечисления, а тип результата — определяемый перечислимый тип. Предвыполнение определения перечислимого типа создает перечислимый тип; это предвыполнение включает предвыполнение каждой спецификации литерала перечисления.
Каждый литерал перечисления вырабатывает отличное от других перечислимое значение. Предопределенные операции отношения упорядоченное- ти между перечислимыми значениями учитывают порядок, соответствующий номеру позиции; номер позиции первого значения в списке литералов перечисления равен нулю; номер каждого следующего литерала перечисления на единицу больше номера предыдущего литерала в списке.
Если один и тот же идентификатор или символьный литерал задан в нескольких определениях перечислимого типа, соответствующие литералы называются совмещенными. В тексте программы тип совмещенного литерала перечисления должен быть определимым из контекста (см. 8.7).
Примеры:
type ДЕНЬ is (ПНД, ВТР, СРД, ЧТВ, ПТН, СББ, ВСК) ;
type МАСТЬ is (ТРЕФЫ, БУБНЫ, ЧЕРВЫ, ПИКИ);
type РОД is (М, Ж) ;
type УРОВЕНЬ is (НИЗШИЙ, СРЕДНИЙ, СРОЧНЫЙ) ;
type ЦВЕТ is (БЕЛЫЙ, КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ, ГОЛУБОЙ, КОРИЧНЕВЫЙ, ЧЕРНЫЙ);
type СВЕТ is (КРАСНЫЙ, ЯНТАРНЫЙ, ЗЕЛЕНЫЙ):
- - КРАСНЫЙ и ЗЕЛЕНЫЙ совмещены.
type ШЕСТНАДЦАТЕРИЧНЫЕ is ('А','В','С', 'D', 'е', 'F');
type СМЕШАННЫЙ is ('А', 'в', В, НИЧТО,'?','%') ;
subtype ДЕНЬ НЕДЕЛИ is ДЕНЬ range ПНД . .ПТН;
subtype КОЗЫРЬ is МАСТЬ range ЧЕРВЫ . . ПИКИ;
subtype РАДУГА is ЦВЕТ rangy КРАСНЫЙ . . ГОЛУБОЙ;
- - КРАСНЫЙ - цвет, но не свет.
Примечание. Если литерал перечисления встречается в контексте, недостаточном для определения типа литерала, то один из путей разрешения неоднозначности - это применение квалифицированного выражения с именем перечислимого типа (см. 8.7).
Символьные типы
Перечислимый тип называется символьным, если хотя бы один из его литералов перечисления является символьным литералом. Предопределенный тип CHARACTER — символьный тип, значения которого представляют собой 195 символов стандартного набора. Каждый из 161 графических символов этого символьного набора обозначен соответствующим символьным литералом.
Пример:
type РИМСКАЯ_ЦИФРА is (Т, V, 'х', 'Ь', 'С', 'D', 'М');
Примечание. Предопределенные пакеты ASCII и ГОСТ включают описания констант, обозначающих управляющие символы, а также констант, обозначающих графические символы, не входящие в основной набор символов.
Другой символьный набор, например EBCDIC, можно описать как символьный тип; внутренние коды символов можно задать спецификатором представления перечислимых, как пояснено в разд. 13.3.
Л о г и ч е с к и е типы
Существует предопределенный перечислимый тип, именуемый BOOLEAN. Он содержит два литерала FALSE и TRUE, упорядоченные отношением FALSE < TRUE. Логический тип — это тип BOOLEAN или производный, непосредственно или косвенно, от логического типа.
Целые типы
Определение целого типа задает целый тип, набор значений которого включает по крайней мере значения из заданного диапазона.
определение_целого_типа : : = ограничение_диапазона
В ограничении диапазона, используемого в определении целого типа, границы диапазона должны определяться статическими выражениями некоторого, не обязательно одного и того же, целого типа. (Допускаются отрицательные границы.)
Описание типа в форме:
type Т is range Л . . П;
по определению эквивалентно следующим описаниям:
type целый _тип is new предопределенный_целый_тип;
subtype Т is целый _тип range целый _тип (Л) . . целый_тип (П): где целый_тип — это анонимный тип, а предопределенный целый тип неявно выбран реализацией и содержит значения от Л до П включительно. Описание целого типа неправильно, если ни один из предопределенных целых типов не удовлетворяет этому требованию, за исключением типа универсальный_ целый. Предвыполнение описания целого типа состоит из предвыполнения эквивалентных описаний типа и подтипа.
Предопределенные целые типы включают тип INTEGER. Реализация может также иметь предопределенные типы SHORT_INTEGER и LONG_INTE- GER, диапазоны которых соответственно (существенно) уже и шире, чем у типа INTEGER. Диапазон для значений этих типов должен быть симметричным относительно нуля, кроме наименьшего из отрицательных значений, которое может существовать в некоторых реализациях. Базовым для каждого из этих типов является он сам.
Целый литерал — это литерал анонимного предопределенного целого типа, который в данном стандарте называется универсальным_целым. Другие целые типы не имеют литералов. Однако для каждого целого типа существует неявное преобразование универсального _целого значения в соответствующее значение (если оно есть) целого типа. Обстоятельства, в которых применяются такие неявные преобразования, описаны в разд. 4.6.
Номер позиции целого значения — это соответствующее значение типа универсальный _целый.
Для всех целых типов предопределены одни и те же арифметические операции (см. 4.5). Исключение NUMERIC_ERROR возбуждается при выполнении операции (в частности, неявного преобразования), которая не может передать корректный результат (т. е. значение, соответствующее математическому результату, не является значением целого типа). Однако от реализации не требуется возбуждения исключения NUMERIC_ERROR, если операция является частью большего выражения, результат которого может быть вычислен корректно, как пояснено в разд. 11.6.
Примеры:
type НОМЕР_СТРАНИЦЫ is range 1 .. 2_000;
type РАЗМЕР_СТРОЧКИ is range 1 . . МАКС_РАЗМЕР_СТРОЧКИ;
subtype МАЛОЕ_ЦЕЛ is INTEGER range -10 . . 10;
subtype УКАЗ_СТОЛБЦА is РАЗМЕР_СТРОЧКИ range 1 . . 10;
subtype РАЗМЕР_БУФЕРА is INTEGER range 0 . . МАКС;
Примечание. Имя в описании целого числа - это имя подтипа. С другой стороны, предопределенные операции над целым типом определяют результат, который принадлежит диапазону, определяемому родительским предопределенным типом; такой результат необязательно принадлежит описанному подтипу, и попытка присвоить такой результат переменной целого подтипа возбуждает исключение CONSTRAINT-ERROR.
Наименьшее (наибольшее по модулю отрицательное) значение, поддержанное реализацией для предопределенных целых типов, есть именованное число SYSTEM. MININT, анаиболыиее (из положительных) значение - SYSTEM.MAXINT (см. 13.7).
О п е р а ц и и над дискретными типами
Базовые операции над дискретными типами включают присваивание, проверку принадлежности и квалификацию; для логических типов — управление с промежуточной проверкой; для целого типа — явное преобразование значений других числовых типов к этому целому типу и неявное преобразование значений типа универсальный _целый к значению заданного типа.
Для каждого дискретного типа или подтипа Т базовые операции включают перечисленные ниже атрибуты. В этом перечислении Т ссылается на подтип (подтип Т) для любого свойства, зависящего от ограничений для Т; другие свойства установлены в-терминах базового типа Т.
Первая группа атрибутов вырабатывает характеристики подтипа Т. Эта группа включает атрибут BASE (см. 3.3.3), атрибуты FIRST и LAST (см. 3.5), атрибут представления SIZE (см. 13.7.2) и атрибут WIDTH, определенный следующим образом: