Spec-Zone.ru › Ada 2012
Справочник Ada 2012

3.5 Скалярные типы

Скалярные типы включают типы перечислений, целые типы и типы вещественных чисел. Типы перечислений и целые типы называются дискретными типами; каждое значение дискретного типа имеет номер позиции, который является целым значением. Целые типы и типы вещественных чисел называются числовыми типами. Все скалярные типы упорядочены, то есть для их значений определены все реляционные операторы.

Синтаксис

range_constraint ::= range range
range ::= range_attribute_reference
| simple_expression .. simple_expression
Диапазон имеет нижнюю границу и верхнюю границу и определяет подмножество значений некоторого скалярного типа (тип диапазона). Диапазон с нижней границей L и верхней границей R описывается как «L .. R». Если R меньше L, то диапазон является пустым и определяет пустое множество значений. В противном случае диапазон определяет значения типа от нижней границы до верхней границы включительно. Значение принадлежит диапазону, если оно относится к типу диапазона и входит в подмножество значений, указанное диапазоном. Значение удовлетворяет ограничению диапазона, если оно принадлежит соответствующему диапазону. Один диапазон включается в другой, если все значения, которые принадлежат первому диапазону, также принадлежат второму.

Правила разрешения имен

Для subtype_indication, содержащей range_constraint, прямо или как часть другого scalar_constraint, тип range должен быть разрешен как тип, определяемый subtype_mark subtype_indication. Для range заданного типа выражения simple_expression (аналогично, выражения simple_expression эквивалентного range для range_attribute_reference) должны быть типа range.

Статическая семантика

Базовый диапазон скалярного типа — это диапазон конечных значений типа, которые могут быть представлены в каждом неограниченном объекте типа; это также диапазон, поддерживаемый как минимум для промежуточных значений во время вычисления выражений, включающих предопределенные операторы типа.
Ограниченный скалярный подтип — это подтип, к которому применяется ограничение диапазона. Диапазон ограниченного скалярного подтипа — это диапазон, связанный с ограничением диапазона подтипа. Диапазон неограниченного скалярного подтипа — это базовый диапазон его типа.

Динамическая семантика

Диапазон совместим со скалярным подтипом тогда и только тогда, когда он либо пустой, либо каждая граница диапазона принадлежит диапазону подтипа. range_constraint совместим со скалярным подтипом тогда и только тогда, когда его диапазон совместим с подтипом.
Выполнение range_constraint состоит из вычисления range. Вычисление range определяет нижнюю и верхнюю границы. Если для указания границ даны выражения simple_expression, вычисление 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 эквивалентен диапазону 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. Для типа с фиксированной точкой функция возвращает результат прибавления small к значению Arg. Для типа с плавающей точкой функция возвращает машинный номер (как определено в 3.5.7), непосредственно следующий за значением Arg; если такого машинного номера нет, возникает Constraint_Error.
S'Pred
S'Pred обозначает функцию со следующим описанием:
function S'Pred(Arg : S'Base)
return S'Base
Для типа перечисления функция возвращает значение, номер позиции которого на единицу меньше, чем значение Arg; если такого значения нет, возникает Constraint_Error. Для целочисленного типа функция возвращает результат вычитания единицы из значения Arg. Для типа с фиксированной точкой функция возвращает результат вычитания small из значения Arg. Для типа с плавающей точкой функция возвращает машинный номер (как определено в 3.5.7), непосредственно предшествующий значению Arg; если такого машинного номера нет, возникает Constraint_Error.
S'Wide_Wide_Image

S'Wide_Wide_Image обозначает функцию со следующим описанием:
function S'Wide_Wide_Image(Arg : S'Base)
return Wide_Wide_String
Функция возвращает изображение значения Arg, то есть последовательность символов, представляющих значение в формате отображения. Нижняя граница результата равна единице.
Изображение целочисленного значения — это соответствующее десятичное литерал без подчеркиваний, ведущих нулей, экспоненты или хвостовых пробелов, но с одним ведущим символом, который либо знак минус, либо пробел.
Изображение значения типа перечисления — это соответствующий идентификатор в верхнем регистре или соответствующий символьный литерал (включая две апострофы); ни ведущие, ни хвостовые пробелы не включаются. Для неграфического символа (значение типа символов, которому не соответствует литерал перечисления), результатом является соответствующее определяемое языком имя в верхнем регистре (например, изображение неграфического символа, идентифицированного как nul, — «NUL» — кавычки не являются частью изображения).
Изображение значения с плавающей точкой — это десятичный вещественный литерал, наилучшим образом приближающий значение (округлённый от нуля, если находится посередине) с одним ведущим символом, который либо знак минус, либо пробел, одной цифрой (не равной нулю, если значение не равно нулю), десятичной точкой, S'Digits-1 (см. 3.5.8) цифр после десятичной точки (но одна, если S'Digits равна единице), заглавной буквой E, знаком показателя степени (либо + либо –) и двумя или более цифрами (с ведущими нулями при необходимости), представляющими показатель степени. Если S'Signed_Zeros — True, то ведущий символ — знак минус для отрицательно значащего нуля.
END_OF_DOCUMENT_MARKER
Изображение фиксированного значения точки — десятичное вещественное литерал, наилучшим образом приближающее значение (округленное от нуля, если находится ровно посередине) с одной ведущей буквой, которая представляет собой знак минус или пробел, одной или несколькими цифрами перед десятичной точкой (без лишних ведущих нулей), десятичной точкой и S'Aft (см. 3.5.10) цифрами после десятичной точки.
S'Wide_Image
S'Wide_Image обозначает функцию со следующим описанием:
function S'Wide_Image(Arg : S'Base)
return Wide_String
Функция возвращает изображение значения Arg в виде Wide_String. Нижняя граница результата — один. Изображение имеет ту же последовательность графических символов, что и определено для S'Wide_Wide_Image, если все графические символы определены в Wide_Character; в противном случае последовательность символов определяется реализацией (но не короче, чем последовательность S'Wide_Wide_Image для того же значения Arg).
Абзацы с 31 по 34 были перемещены в Wide_Wide_Image.
S'Image
S'Image обозначает функцию со следующим описанием:
function S'Image(Arg : S'Base)
return String
Функция возвращает изображение значения Arg в виде String. Нижняя граница результата — один. Изображение имеет ту же последовательность графических символов, что и определено для S'Wide_Wide_Image, если все графические символы определены в Character; в противном случае последовательность символов определяется реализацией (но не короче, чем последовательность S'Wide_Wide_Image для того же значения Arg).
S'Wide_Wide_Width

S'Wide_Wide_Width обозначает максимальную длину Wide_Wide_String, возвращаемую функцией S'Wide_Wide_Image для всех значений подтипа S. Для подтипа с пустым диапазоном обозначает ноль. Тип — universal_integer.
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_Wide_Value

S'Wide_Wide_Value обозначает функцию со следующим описанием:
function S'Wide_Wide_Value(Arg : Wide_Wide_String)
return S'Base
Эта функция возвращает значение, заданное изображением значения в виде Wide_Wide_String, игнорируя ведущие и хвостовые пробелы.
Для вычисления вызова S'Wide_Wide_Value для подтипа перечисления S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис литерала перечисления и если она соответствует литералу типа S (или соответствует результату S'Wide_Wide_Image для неграфического символа типа), результатом является соответствующее значение перечисления; в противном случае поднимается Constraint_Error.
Для вычисления вызова S'Wide_Wide_Value для целочисленного подтипа S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис целочисленного литерала с необязательным ведущим знаком (плюс или минус для знакового типа; только плюс для модульного типа), и соответствующее числовое значение принадлежит базовому диапазону типа S, то это значение является результатом; в противном случае поднимается Constraint_Error.
Для вычисления вызова S'Wide_Wide_Value для вещественного подтипа S, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис одного из следующих:
numeric_literal
numeral.[exponent]
.numeral[exponent]
base#based_numeral.#[exponent]
base#.based_numeral#[exponent]
с необязательным ведущим знаком (плюс или минус), и если соответствующее числовое значение принадлежит базовому диапазону типа S, то это значение является результатом; в противном случае поднимается Constraint_Error. Знак нулевого значения сохраняется (положительный, если не был указан), если S'Signed_Zeros имеет значение True.
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 вычисление вызова S'Wide_Value с Arg типа Wide_String эквивалентно вызову S'Wide_Wide_Value для соответствующего Arg типа Wide_Wide_String.
Абзацы с 44 по 51 были перемещены в Wide_Wide_Value.
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_Wide_Value для соответствующего Arg типа Wide_Wide_String.
Для префикса X, обозначающего объект скалярного типа (после любого неявного разыменования), определены следующие атрибуты:
X'Wide_Wide_Image

X'Wide_Wide_Image — результат вызова функции S'Wide_Wide_Image с Arg, являющимся X, где S — номинальный подтип X.
X'Wide_Image

X'Wide_Image — результат вызова функции S'Wide_Image с Arg, являющимся X, где S — номинальный подтип X.
X'Image
X'Image — результат вызова функции S'Image с Arg, являющимся X, где S — номинальный подтип X.

Разрешения реализации

Реализация может расширить атрибуты Wide_Wide_Value, Wide_Value, Value, Wide_Wide_Image, Wide_Image и Image типа с плавающей точкой для поддержки специальных значений, таких как бесконечности и NaN.
Реализация может расширить атрибуты Wide_Wide_Value, Wide_Value и Value типа символа, чтобы принять строки вида “Hex_hhhhhhhh” (игнорируя регистр) для любого символа (не только для тех, для которых Wide_Wide_Image произведет эту форму — см. 3.5.2), а также трехсимвольные строки вида “'X'”, где X — любой символ, включая неграфические символы.

Статическая семантика

Для скалярного типа может быть указан следующий определяемый языком аспект представления с помощью определения_аспекта (см. 13.1.1):
Default_Value

Этот аспект должен быть указан статическим выражением, и это выражение должно быть явным, даже если аспект имеет булевый тип. Default_Value должен быть указан только в полном_объявлении_типа.
Если производный тип без примитивных подпрограмм наследует булевый аспект Default_Value, аспект может быть указан с любым значением для производного типа.

Правила разрешения имен

Ожидаемый тип для выражения, указанного для аспекта Default_Value, — тип, определенный в полном_объявлении_типа, в котором он появляется.
ПРИМЕЧАНИЯ
27 Оценка S'First или S'Last никогда не вызывает исключение. Если скалярный подтип S имеет непустой диапазон, S'First и S'Last принадлежат этому диапазону. Эти значения всегда могут быть присвоены переменной подтипа S.
28 Для подтипа скалярного типа результат, возвращаемый атрибутами Succ, Pred и Value, может не принадлежать подтипу; аналогично, фактические параметры атрибутов Succ, Pred и Image не обязательно должны принадлежать подтипу.
29 Для любого значения V (включая любой неграфический символ) подтипа перечисления S, S'Value(S'Image(V)) равно V, так же как S'Wide_Value(S'Wide_Image(V)) и S'Wide_Wide_Value(S'Wide_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