Руководство по Ada (Ada 2022)
3.5 Скалярные типы
Скалярные типы включают типы перечисления, целые типы и вещественные типы. Типы перечисления и целые типы называются дискретными типами; каждое значение дискретного типа имеет порядковый номер, который является целым значением. Целые типы и вещественные типы называются числовыми типами. Все скалярные типы упорядочены, то есть для их значений определены все реляционные операторы.
Синтаксис
Диапазон имеет нижнюю границу и верхнюю границу и определяет подмножество значений некоторого скалярного типа (тип диапазона). Диапазон с нижней границей L и верхней границей R описывается как “L .. R”. Если R меньше L, то диапазон является пустым диапазоном и определяет пустое множество значений. В противном случае диапазон определяет значения типа от нижней границы до верхней границы включительно. Значение принадлежит диапазону, если оно имеет тип диапазона и находится в подмножестве значений, задаваемом диапазоном. Значение удовлетворяет ограничению диапазона, если оно принадлежит соответствующему диапазону. Один диапазон включается в другой, если все значения, принадлежащие первому диапазону, также принадлежат второму.
Правила разрешения имен
Для subtype_indication, содержащей range_constraint, непосредственно или как часть другого scalar_constraint, тип range должен быть разрешён к типу, определяемому меткой типа subtype_mark subtype_indication. Для диапазона range заданного типа, simple_expressionы диапазона (аналогично, simple_expressionы эквивалентного диапазона для range_attribute_reference) должны быть типа диапазона range.
Статические семантики
Базовый диапазон скалярного типа — это диапазон конечных значений типа, которые могут быть представлены в каждом не ограниченном объекте типа; это также диапазон, поддерживаемый как минимум для промежуточных значений во время оценки выражений, включающих предопределённые операторы типа.
Ограниченный скалярный подтип — это подтип, к которому применяется ограничение диапазона. Диапазон ограниченного скалярного подтипа — это диапазон, связанный с ограничением диапазона подтипа. Диапазон неограниченного скалярного подтипа — это базовый диапазон его типа.
Динамические семантики
Диапазон совместим со скалярным подтипом тогда и только тогда, когда он является либо пустым диапазоном, либо каждая граница диапазона принадлежит диапазону подтипа. range_constraint совместим со скалярным подтипом тогда и только тогда, когда его диапазон совместим с подтипом.
Выполнение range_constraint состоит из оценки range. Оценка range определяет нижнюю и верхнюю границы. Если для задания границ заданы simple_expressionы, оценка range оценивает эти simple_expressionы в произвольном порядке и преобразует их к типу 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
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. Для типа с фиксированной точкой функция возвращает результат добавления small к значению 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. Для типа с фиксированной точкой функция возвращает результат вычитания small из значения Arg. Для типа с плавающей точкой функция возвращает машинное число (как определено в 3.5.7) непосредственно ниже значения Arg; Constraint_Error возбуждается, если такого машинного числа нет.
Параграфы от 28 до 37 были перемещены в 4.10, «Атрибуты изображения».
S'Wide_Wide_Width
S'Wide_Wide_Width обозначает максимальную длину Wide_Wide_String, возвращаемую S'Wide_Wide_Image для всех значений подтипа S, предполагая стандартную реализацию S'Put_Image. Обозначает ноль для подтипов с пустым диапазоном. Его тип — universal_integer.
S'Wide_Width
S'Wide_Width обозначает максимальную длину Wide_String, возвращаемую S'Wide_Image для всех значений подтипа S, предполагая стандартную реализацию S'Put_Image. Обозначает ноль для подтипов с пустым диапазоном. Его тип — universal_integer.
S'Width
S'Width обозначает максимальную длину String, возвращаемую S'Image для всех значений подтипа S, предполагая стандартную реализацию S'Put_Image. Обозначает ноль для подтипов с пустым диапазоном. Его тип — universal_integer.
S'Wide_Wide_Value
S'Wide_Wide_Value обозначает функцию со следующей спецификацией:
function S'Wide_Wide_Value(Arg : Wide_Wide_String)
return S'Base
return S'Base
Эта функция возвращает значение, заданное изображением значения как Wide_Wide_String, игнорируя пробелы в начале и конце.
END_OF_DOCUMENT_MARKER
Для оценки вызова 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, если последовательность символов параметра (исключая начальные и конечные пробелы) имеет синтаксис одного из следующих:
с необязательным начальным знаком (плюс или минус), и если соответствующее числовое значение принадлежит базовому диапазону типа S, то это значение является результатом; в противном случае возникает Constraint_Error. Знак нулевого значения сохраняется (положительный, если не был указан), если S'Signed_Zeros равно True.
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 для значения типа, предполагая стандартную реализацию S'Put_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
return S'Base
Эта функция возвращает значение, заданное изображением значения как String, игнорируя начальные и конечные пробелы.
Для оценки вызова S'Value для подтипа перечисления S, если последовательность символов параметра (исключая начальные и конечные пробелы) имеет синтаксис литерала перечисления и если она соответствует литералу типа S (или соответствует результату S'Image для значения типа, предполагая стандартную реализацию S'Put_Image), результат — соответствующее значение перечисления; в противном случае возникает Constraint_Error. Для числового подтипа S, вычисление вызова S'Value с Arg типа String эквивалентно вызову S'Wide_Wide_Value для соответствующего Arg типа Wide_Wide_String.
Разрешения реализации
Реализация может расширить атрибуты 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 — любой символ, включая неграфические символы.
Статическая семантика
Для скалярного типа может быть указан следующий определённый языком аспект представления с помощью aspect_specification (см. 13.1.1):
Default_Value
Этот аспект должен быть указан статическим выражением, и это выражение должно быть явным, даже если аспект имеет булев тип. Default_Value должен быть указан только в полном объявлении типа.
Если производный тип наследует булев аспект Default_Value, аспект может быть указан с любым значением для производного типа. Если производный тип T не наследует аспект Default_Value, он не должен указывать такой аспект, если он наследует примитивный подпрограмму, имеющую параметр типа T с режимом out.
Правила разрешения имён
Ожидаемый тип для выражения, указанного для аспекта Default_Value, — это тип, определённый полным объявлением типа, на котором он появляется.
ПРИМЕЧАНИЕ 1 Вычисление S'First или S'Last никогда не вызывает исключения. Если скалярный подтип S имеет непустой диапазон, S'First и S'Last принадлежат этому диапазону. Эти значения, например, всегда можно присвоить переменной типа S.
ПРИМЕЧАНИЕ 2 Для подтипа скалярного типа результат, возвращаемый атрибутами Succ, Pred и Value, может находиться вне подтипа; аналогично, фактические параметры атрибутов Succ, Pred и Image также могут находиться вне подтипа.
ПРИМЕЧАНИЕ 3 Для любого значения V (включая любой неграфический символ) подтипа перечисления S без заданного Put_Image (см. 4.10), 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
Красный .. Зелёный -- см. 3.5.1
1 .. 0 -- пустой диапазон
Диапазон'Range -- ссылка на атрибут диапазона (см. 3.6)
X .. X + 1
0.0 .. 2.0*Pi
Красный .. Зелёный -- см. 3.5.1
1 .. 0 -- пустой диапазон
Диапазон'Range -- ссылка на атрибут диапазона (см. 3.6)
Примеры ограничений диапазона:
range -999.0 .. +999.0
range S'First+1 .. S'Last-1
range S'First+1 .. S'Last-1