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

4.9 Статические выражения и статические подтипы

Некоторые выражения скалярного или строкового типа определены как статические. Аналогично, определены статические дискретные диапазоны и некоторые скалярные и строковые подтипы. Статический означает определяемый на этапе компиляции, используя объявленные свойства или значения сущностей программы.
Статическое выражение — это скалярное или строковое выражение, которое является одним из следующих:
  • числовая константа;
  • строковая константа статического строкового подтипа;
  • идентификатор, обозначающий объявление именованного числа или статической константы;
  • вызов функции, у которой имя или префикс имени функции статически обозначает статическую функцию, а фактические параметры, если таковые имеются (заданные явно или по умолчанию), — все статические выражения;
  • ссылка на атрибут, обозначающая скалярное значение, а её префикс обозначает статический скалярный подтип;
  • ссылка на атрибут, у которой префикс статически обозначает статически ограниченный массив или подтип массива, а атрибут — First, Last или Length с необязательной размерностью;
  • преобразование типа, у которого метка подтипа обозначает статический скалярный подтип, а операнд — статическое выражение;
  • квалифицированное выражение, у которого метка подтипа обозначает статический (скалярный или строковый) подтип, а операнд — статическое выражение;
  • тест на принадлежность, у которого простое выражение — статическое выражение, а диапазон — статический диапазон или у которого метка подтипа обозначает статический (скалярный или строковый) подтип;
  • форма управления короткого замыкания, у обоих отношений которой являются статическими выражениями;
  • статическое выражение, заключённое в скобки.
Идентификатор статически обозначает сущность, если он обозначает сущность и:
  • Это прямой идентификатор, расширенный идентификатор или символьная константа, и он обозначает объявление, отличное от переименования;
  • Это ссылка на атрибут, префикс которой статически обозначает некоторую сущность;
  • Он обозначает объявление переименования с идентификатором, который статически обозначает переименованную сущность.
Статическая функция — это одна из следующих:
  • предопределённый оператор, у которого типы параметров и результата — все скалярные типы, ни один из которых не является потомком формального скалярного типа;
  • предопределённый оператор конкатенации, у которого тип результата — строковый тип;
  • перечисление;
  • определённый в языке атрибут, являющийся функцией, если префикс обозначает статический скалярный подтип, и если типы параметров и результата — скалярные.
В любом случае, формальный подпрограмма-генератор не является статической функцией.
Статическая константа — это константный вид, объявленный полным объявлением константы или объявлением переименования объекта со статическим номинальным подтипом, имеющим значение, определённое статическим скалярным выражением или статическим строковым выражением, длина которого не превышает максимальную длину строковой константы в реализации.
Статический диапазон — это диапазон, границы которого — статические выражения, или ссылка на атрибут диапазона, которая эквивалентна такому диапазону. Статический дискретный диапазон — это статический диапазон или указание подтипа, определяющее статический скалярный подтип. Базовый диапазон скалярного типа — статический диапазон, за исключением случаев, когда тип является потомком формального скалярного типа.
Статический подтип — это либо статический скалярный подтип, либо статический строковый подтип. Статический скалярный подтип — это неограниченный скалярный подтип, тип которого не является потомком формального скалярного типа, или ограниченный скалярный подтип, образованный наложением совместимого статического ограничения на статический скалярный подтип. Статический строковый подтип — это неограниченный строковый подтип, подтип индекса и подтип компонента которого статические (и тип которого не является потомком формального массива типа), или ограниченный строковый подтип, образованный наложением совместимого статического ограничения на статический строковый подтип. В любом случае, подтип формального объекта-генератора режима in out и подтип результата формальной функции-генератора не являются статическими.
Различные виды статических ограничений определяются следующим образом:
  • Нулевое ограничение всегда статическое;
  • Скалярное ограничение статическое, если оно не имеет ограничения диапазона или имеет статический диапазон;
  • Ограничение индекса статическое, если каждый дискретный диапазон статический, и каждый подтип индекса соответствующего массива типа статический;
  • Ограничение дискриминанты статическое, если каждое выражение ограничения статическое, и подтип каждой дискриминанты статический.
Подтип считается статически ограниченным, если он ограничен, а его ограничение статическое. Объект считается статически ограниченным, если его номинальный подтип статически ограничен или если он статическая строковая константа.

Правила легитимности

Статическое выражение вычисляется на этапе компиляции, за исключением случаев, когда оно является частью правого операнда статической формы управления короткого замыкания, значение которой определяется его левым операндом. Это вычисление выполняется точно, без выполнения проверок переполнения. Для статического выражения, которое вычисляется:
  • Выражение неправомерно, если при его вычислении не выполняется проверка, определённая языком, кроме проверки переполнения.
  • Если выражение не является частью более крупного статического выражения, то его значение должно находиться в пределах базового диапазона его ожидаемого типа. В противном случае значение может быть сколь угодно большим или малым.
  • Если выражение имеет тип universal_real, а его ожидаемый тип — десятичный тип с плавающей запятой, то его значение должно быть кратным small десятичного типа.
Последние два ограничения не применяются, если ожидаемый тип является потомком формального скалярного типа (или соответствующего фактического типа в экземпляре).

Требования к реализации

Для вещественного статического выражения, которое не является частью более крупного статического выражения, и ожидаемый тип которого не является потомком формального скалярного типа, реализация должна округлять или усекать значение (в соответствии с атрибутом Machine_Rounds ожидаемого типа) до ближайшего машинного числа ожидаемого типа; если значение находится ровно посередине между двумя машинными числами, любое округление должно выполняться от нуля. Если ожидаемый тип является потомком формального скалярного типа, никакое специальное округление или усечение не требуется — применяются обычные правила точности (см. Приложение G).
ПРИМЕЧАНИЯ
28 Выражение может быть статическим даже если оно встречается в контексте, где статичность не требуется.
29 Статическое (или динамическое) преобразование типа от вещественного типа к целому типу выполняет округление. Если значение операнда находится ровно посередине между двумя целыми числами, округление выполняется от нуля.

Примеры

Примеры статических выражений:
1 + 1 -- 2
abs(-10)*3 -- 30
Kilo : constant := 1000;
Mega : constant := Kilo*Kilo; -- 1_000_000
Long : constant := Float'Digits*2;
Half_Pi : constant := Pi/2; -- см. 3.3.2
Deg_To_Rad : constant := Half_Pi/90;
Rad_To_Deg : constant := 1.0/Deg_To_Rad; -- эквивалентно 1.0/((3.14159_26536/2)/90)


Spec-Zone.ru

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