Справочник Ada 95
3.5 Скалярные типы
Скалярные типы включают перечисления, целые и вещественные типы. Типы перечисления и целые типы называются дискретными типами; каждое значение дискретного типа имеет номер позиции, являющийся целым значением. Целые и вещественные типы называются числовыми типами. Все скалярные типы упорядочены, то есть для их значений определены все реляционные операторы.
Синтаксис
range_constraint ::= range range
range ::= range_attribute_reference
| простое_выражение .. простое_выражение
| простое_выражение .. простое_выражение
Диапазон имеет нижнюю и верхнюю границы и определяет подмножество значений некоторого скалярного типа (тип диапазона). Диапазон с нижней границей L и верхней границей R описывается как ``L .. R''. Если R меньше L, то диапазон является пустым диапазоном и определяет пустое множество значений. В противном случае диапазон определяет значения типа от нижней границы до верхней границы включительно. Значение принадлежит диапазону, если оно имеет тип диапазона и находится в подмножестве значений, определённом диапазоном. Значение удовлетворяет ограничению диапазона, если оно принадлежит соответствующему диапазону. Один диапазон входит в другой, если все значения, принадлежащие первому диапазону, также принадлежат второму.
Правила разрешения имён
Для subtype_indication, содержащего range_constraint, прямо или как часть некоторого другого scalar_constraint, тип range должен быть разрешен как тип, определенный subtype_mark в subtype_indication. Для range заданного типа, простые_выражения range (аналогично, простые_выражения эквивалентного range для range_attribute_reference) должны быть типа range.
Статическая семантика
Базовый диапазон скалярного типа — это диапазон конечных значений типа, которые могут быть представлены в каждом неограниченном объекте типа; это также минимальный диапазон, поддерживаемый для промежуточных значений во время вычисления выражений, использующих предопределённые операторы типа.
Ограниченный скалярный подтип — это подтип, к которому применяется ограничение диапазона. Диапазон ограниченного скалярного подтипа — это диапазон, связанный с ограничением диапазона подтипа. Диапазон неограниченного скалярного подтипа — это базовый диапазон его типа.
Динамическая семантика
Диапазон совместим со скалярным подтипом тогда и только тогда, когда он либо пустой диапазон, либо каждая граница диапазона принадлежит диапазону подтипа. range_constraint совместим со скалярным подтипом тогда и только тогда, когда его диапазон совместим с подтипом.
Вычисление range_constraint состоит из вычисления range. Вычисление range определяет нижнюю и верхнюю границы. Если для задания границ указаны простые_выражения, то вычисление range вычисляет эти простые_выражения в произвольном порядке и преобразует их в тип range. Если задана range_attribute_reference, то вычисление range состоит из вычисления range_attribute_reference.
Атрибуты
Для каждого скалярного подтипа S определены следующие атрибуты:
- S'First
- S'First обозначает нижнюю границу диапазона S. Значение этого атрибута имеет тип S.
- S'Last
- S'Last обозначает верхнюю границу диапазона S. Значение этого атрибута имеет тип S.
- S'Range
- S'Range эквивалентно range S'First .. S'Last.
- S'Base
- S'Base обозначает неограниченный подтип типа S. Этот неограниченный подтип называется базовым подтипом типа.
- S'Min
- S'Min обозначает функцию со следующим описанием:
function S'Min(Left, Right : S'Base)
return S'Base
return S'Base
- Функция возвращает меньшее из значений двух параметров.
- S'Max
- S'Max обозначает функцию со следующим описанием:
function S'Max(Left, Right : S'Base)
return S'Base
return S'Base
- Функция возвращает большее из значений двух параметров.
- S'Succ
- S'Succ обозначает функцию со следующим описанием:
function S'Succ(Arg : S'Base)
return S'Base
return S'Base
- Для типа перечисления функция возвращает значение, номер позиции которого на единицу больше, чем у значения Arg; Constraint_Error возникает, если такого значения типа нет. Для целочисленного типа функция возвращает результат сложения единицы к значению Arg. Для типа с плавающей точкой функция возвращает машинное число (как определено в 3.5.7) непосредственно выше значения Arg; Constraint_Error возникает, если такого машинного числа нет.
- S'Pred
- S'Pred обозначает функцию со следующим описанием:
function S'Pred(Arg : S'Base)
return S'Base
return S'Base
- Для типа перечисления функция возвращает значение, номер позиции которого на единицу меньше, чем у значения Arg; Constraint_Error возникает, если такого значения типа нет. Для целочисленного типа функция возвращает результат вычитания единицы из значения Arg.
- S'Wide_Image
- S'Wide_Image обозначает функцию со следующим описанием:
function S'Wide_Image(Arg : S'Base)
return Wide_String
return Wide_String
- Функция возвращает изображение значения Arg, то есть последовательность символов, представляющую значение в форме отображения. Нижняя граница результата равна единице.
- Изображение целочисленного значения — это соответствующая десятичная константа без нижних подчеркиваний, ведущих нулей, экспоненты или хвостовых пробелов, но с одним ведущим символом, который является либо знаком минус, либо пробелом.
- Изображение значения перечисления — это соответствующий идентификатор в верхнем регистре или соответствующая символьная константа (включая две апострофы); ни ведущие, ни хвостовые пробелы не включаются. Для неграфического символа (значения типа символа, которому не соответствует литерал перечисления), результатом является соответствующее определяемое языком или реализацией имя в верхнем регистре (например, изображение неграфического символа, идентифицируемого как nul, — это ``NUL'' — кавычки не являются частью изображения).
- Изображение значения с плавающей точкой — это десятичная вещественная константа, наилучшим образом аппроксимирующая значение (округленная от нуля, если находится посередине) с одним ведущим символом, который является либо знаком минус, либо пробелом, одной цифрой (которая не равна нулю, если значение не равно нулю), десятичной точкой, S'Digits-1 (см. 3.5.8) цифрами после десятичной точки (но одной, если S'Digits равно одной), заглавным E, знаком экспоненты (либо + или -), и двумя или более цифрами (с ведущими нулями, если необходимо), представляющими экспоненту. Если S'Signed_Zeros равно True, то ведущий символ — знак минус для отрицательно знакового нуля.
- Изображение значения с фиксированной точкой — это десятичная вещественная константа, наилучшим образом аппроксимирующая значение (округленная от нуля, если находится посередине) с одним ведущим символом, который является либо знаком минус, либо пробелом, одной или несколькими цифрами перед десятичной точкой (без избыточных ведущих нулей), десятичной точкой и S'Aft (см. 3.5.10) цифрами после десятичной точки.
- S'Image
- S'Image обозначает функцию со следующим описанием:
function S'Image(Arg : S'Base)
return String
return String
- Функция возвращает изображение значения Arg в виде String. Нижняя граница результата равна единице. Изображение имеет ту же последовательность графических символов, что и определено для S'Wide_Image, если все графические символы определены в Character; в противном случае последовательность символов определяется реализацией (но не короче, чем S'Wide_Image для того же значения Arg).
- S'Wide_Width
- S'Wide_Width обозначает максимальную длину Wide_String, возвращаемой S'Wide_Image для всех значений подтипа S. Для подтипа с нулевым диапазоном она обозначает ноль. Ее тип — universal_integer.
- S'Width
- S'Width обозначает максимальную длину String, возвращаемой S'Image для всех значений подтипа S. Для подтипа с нулевым диапазоном она обозначает ноль. Ее тип — universal_integer.
- S'Wide_Value
- S'Wide_Value обозначает функцию со следующим описанием:
function S'Wide_Value(Arg : Wide_String)
return S'Base
return S'Base
- Эта функция возвращает значение, заданное изображением значения в виде Wide_String, игнорируя ведущие и хвостовые пробелы.
- Для вычисления вызова S'Wide_Value для подтипа перечисления S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис литерала перечисления и если она соответствует литералу типа S (или соответствует результату S'Wide_Image для неграфического символа типа), результатом является соответствующее значение перечисления; в противном случае поднимается Constraint_Error.
- Для вычисления вызова S'Wide_Value (или S'Value) для целочисленного подтипа S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис целочисленного литерала, с необязательным ведущим знаком (плюс или минус для знаковых типов; только плюс для модулярных типов), и соответствующее числовое значение принадлежит базовому диапазону типа S, то это значение является результатом; в противном случае поднимается Constraint_Error.
- Для вычисления вызова S'Wide_Value (или S'Value) для вещественного подтипа S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис одного из следующих:
- числовой_литерал
- число.[порядок]
- .число[порядок]
- основание#число_в_основании.#[порядок]
- основание#.число_в_основании#[порядок]
- с необязательным ведущим знаком (плюс или минус), и если соответствующее числовое значение принадлежит базовому диапазону типа S, то это значение является результатом; в противном случае поднимается Constraint_Error. Знак нулевого значения сохраняется (положительный, если не указан), если S'Signed_Zeros равен True.
- S'Value
- S'Value обозначает функцию со следующим описанием:
function S'Value(Arg : String)
return S'Base
return S'Base
- Эта функция возвращает значение, заданное изображением значения в виде String, игнорируя ведущие и хвостовые пробелы.
- Для вычисления вызова S'Value для подтипа перечисления S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис литерала перечисления и если она соответствует литералу типа S (или соответствует результату S'Image для значения типа), результатом является соответствующее значение перечисления; в противном случае поднимается Constraint_Error. Для числового подтипа S, вычисление вызова S'Value с Arg типа String эквивалентно вызову S'Wide_Value для соответствующего Arg типа Wide_String.
Разрешения для реализации
Реализация может расширить атрибуты Wide_Value, Value, Wide_Image и Image типа с плавающей точкой для поддержки специальных значений, таких как бесконечности и NaN.
ПРИМЕЧАНИЯ
19 Вычисление S'First или S'Last никогда не вызывает исключение. Если у скалярного подтипа S есть ненулевой диапазон, S'First и S'Last принадлежат этому диапазону. Эти значения, например, всегда можно присвоить переменной подтипа S.
20 Для подтипа скалярного типа результат, возвращаемый атрибутами Succ, Pred и Value, может не принадлежать подтипу; аналогично, фактические параметры атрибутов Succ, Pred и Image не обязательно должны принадлежать подтипу.
21 Для любого значения V (включая любой неграфический символ) подтипа перечисления S, S'Value(S'Image(V)) равно V, как и S'Wide_Value(S'Wide_Image(V)). Ни одно из выражений никогда не вызывает Constraint_Error.
Примеры
Примеры диапазонов:
-10 .. 10
X .. X + 1
0.0 .. 2.0*Pi
Red .. Green -- см. 3.5.1
1 .. 0 -- нулевой диапазон
Table'Range -- ссылка на атрибут диапазона (см. 3.6)
X .. X + 1
0.0 .. 2.0*Pi
Red .. Green -- см. 3.5.1
1 .. 0 -- нулевой диапазон
Table'Range -- ссылка на атрибут диапазона (см. 3.6)
Примеры ограничений диапазона:
range -999.0 .. +999.0
range S'First+1 .. S'Last-1
range S'First+1 .. S'Last-1