Spec-Zone.ru › Ada 95
Справочник 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
Функция возвращает меньшее из значений двух параметров.
S'Max
S'Max обозначает функцию со следующим описанием:
function S'Max(Left, Right : S'Base)
return S'Base
Функция возвращает большее из значений двух параметров.
S'Succ
S'Succ обозначает функцию со следующим описанием:
function S'Succ(Arg : 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
Для типа перечисления функция возвращает значение, номер позиции которого на единицу меньше, чем у значения Arg; Constraint_Error возникает, если такого значения типа нет. Для целочисленного типа функция возвращает результат вычитания единицы из значения Arg.
S'Wide_Image
S'Wide_Image обозначает функцию со следующим описанием:
function S'Wide_Image(Arg : S'Base)
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
Функция возвращает изображение значения 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
Эта функция возвращает значение, заданное изображением значения в виде 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
Эта функция возвращает значение, заданное изображением значения в виде 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)
Примеры ограничений диапазона:
range -999.0 .. +999.0
range S'First+1 .. S'Last-1


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API