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

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ы range (аналогично, simple_expressionы эквивалентного range для 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 эквивалентен 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, если последовательность символов параметра (игнорируя ведущие и хвостовые пробелы) имеет синтаксис одного из следующих:
  • числовой_литерал
  • число.[экспонента]
  • .число[экспонента]
  • основание#число_в_основании.#[экспонента]
  • основание#.число_в_основании#[экспонента]
с необязательным ведущим знаком (плюс или минус), и если соответствующее числовое значение принадлежит базовому диапазону типа 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.

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

Реализация может расширить атрибуты Wide_Wide_Value, Wide_Value, Value, Wide_Wide_Image, Wide_Image и Image вещественного типа, чтобы поддерживать специальные значения, такие как бесконечности и NaN.
ПРИМЕЧАНИЯ
21 Вычисление S'First или S'Last никогда не вызывает исключений. Если скалярный подтип S имеет ненулевой диапазон, S'First и S'Last принадлежат этому диапазону. Эти значения, например, всегда могут быть присвоены переменной подтипа S.
22 Для подтипа скалярного типа результат, возвращаемый атрибутами Succ, Pred и Value, может не принадлежать подтипу; аналогично, фактические параметры атрибутов Succ, Pred и Image не обязательно должны принадлежать подтипу.
23 Для любого значения 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
Красный .. Зеленый -- см. 3.5.1
1 .. 0 -- пустой диапазон
Диапазон'Range -- ссылка на атрибут диапазона (см. 3.6)
Примеры ограничений диапазона:
range -999.0 .. +999.0
range S'First+1 .. S'Last-1


Spec-Zone.ru

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