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

8.5.4 Объявления переименования подпрограмм

Объявление subprogram_renaming_declaration может служить завершением объявления subprogram_declaration; такое объявление renaming_declaration называется переименованием-как-тело. Объявление subprogram_renaming_declaration, которое не является завершением, называется переименованием-как-объявлением и используется для переименования подпрограммы (возможно, перечисления литерала) или входа.

Синтаксис

subprogram_renaming_declaration ::=
[overriding_indicator]
subprogram_specification renames callable_entity_name;

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

Ожидаемый профиль для callable_entity_name — это профиль, указанный в subprogram_specification.

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

Профиль переименования-как-объявления должен быть согласован с режимом переименовываемого вызываемого сущности.
Для подтипа параметра или результата subprogram_specification, который имеет явное null_exclusion:
  • если callable_entity_name обозначает формальную подпрограмму-генератор генеративного модуля G, а объявление subprogram_renaming_declaration встречается в теле генеративного модуля G или в теле генеративного модуля, объявленного в области объявления генеративного модуля G, то соответствующий подтип параметра или результата формальной подпрограммы G должен иметь null_exclusion;
  • иначе, подтип соответствующего типа параметра или результата переименовываемой вызываемой сущности должен исключать null. В дополнение к местам, где обычно применяются Правила легальности (см. 12.3), это правило также применяется в частной части экземпляра генеративного модуля.
Профиль переименования-как-тела должен полностью соответствовать профилю объявления, которое он завершает. Если переименование-как-тело завершает это объявление до того, как объявленная подпрограмма заморожена, профиль должен быть согласован с режимом переименовываемой вызываемой сущности, и подпрограмма, которую он объявляет, принимает соглашение от переименовываемой подпрограммы; в противном случае профиль должен соответствовать подтипу переименовываемой вызываемой сущности, и соглашение переименовываемой подпрограммы не должно быть встроенным. Переименование-как-тело является недопустимым, если объявление происходит до того, как подпрограмма, объявление которой оно завершает, заморожена, и переименование переименовывает саму подпрограмму через одно или несколько объявлений переименования подпрограмм, ни одна из которых не заморожена.
Имя callable_entity_name переименования не должно обозначать подпрограмму, требующую переопределения (см. 3.9.3).
Имя callable_entity_name переименования-как-тела не должно обозначать абстрактную подпрограмму.
Имя, обозначающее формальный параметр subprogram_specification, не разрешается в имени callable_entity_name.

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

Переименование-как-объявление объявляет новый вид переименовываемой сущности. Профиль этого нового вида берет свои подтипы, режимы параметров и соглашение вызова из исходного профиля вызываемой сущности, а формальные имена параметров и значения по умолчанию берутся из профиля, заданного в объявлении subprogram_renaming_declaration. Новый вид является функцией или процедурой, но никогда не является входом.

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

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

Ограниченные (временные) ошибки выполнения

Если подпрограмма напрямую или косвенно переименовывает себя, то вызов этой подпрограммы является ограниченной ошибкой. Возможные последствия — это возбуждение Program_Error или Storage_Error, или вызов приводит к бесконечной рекурсии.
ПРИМЕЧАНИЯ
12 Процедуру можно переименовать только как процедуру. Функцию, чьё defining_designator является либо identifier, либо operator_symbol, можно переименовать либо с помощью identifier, либо с помощью operator_symbol; при переименовании в качестве оператора спецификация подпрограммы, заданная в renaming_declaration, подчиняется правилам, приведенным в 6.6 для объявлений операторов. Литералы перечисления могут быть переименованы как функции; аналогично, attribute_referenceы, обозначающие функции (такие как ссылки на Succ и Pred), могут быть переименованы как функции. Вход может быть переименован только как процедура; новое name разрешается только в контекстах, допускающих имя процедуры name. Вход семейства может быть переименован, но семейство входов не может быть переименовано целиком.
13 Операторы корневых числовых типов не могут быть переименованы, потому что типы в профиле анонимны, поэтому соответствующие спецификации нельзя записать; то же самое относится к некоторым атрибутам, таким как Pos.
14 Вызовы с новым именем переименованного входа являются операторами вызова процедуры и не разрешены в местах, где синтаксис требует оператора вызова входа в conditional_ и timed_entry_callах, а также в asynchronous_selectах; аналогично, атрибут Count недоступен для нового name.
15 Примитивность объявления переименования-как-объявления определяется его профилем и местом его появления, как и для любого объявления (вида) подпрограммы; примитивность не определяется переименовываемым видом. Для выполнения вызова диспетчеризации имя подпрограммы должно обозначать примитивную подпрограмму, а не не-примитивное переименование примитивной подпрограммы.

Примеры

Примеры объявлений переименования подпрограмм:
procedure My_Write(C : in Character) renames Pool(K).Write; -- см. 4.1.3
function Real_Plus(Left, Right : Real ) return Real renames "+";
function Int_Plus (Left, Right : Integer) return Integer renames "+";
function Rouge return Color renames Red; -- см. 3.5.1
function Rot return Color renames Red;
function Rosso return Color renames Rouge;
function Next(X : Color) return Color renames Color'Succ; -- см. 3.5.1
Пример объявления переименования подпрограммы с новыми именами параметров:
function "*" (X,Y : Vector) return Real renames Dot_Product; -- см. 6.1
Пример объявления переименования подпрограммы с новым выражением по умолчанию:
function Minimum(L : Link := Head) return Cell renames Min_Cell; -- см. 6.1


Spec-Zone.ru

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