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

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

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

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

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

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

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

Рекомендации для реализации

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

Примеры

Примеры статических выражений:
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