Справочник по Ada 2012
8.5.4 Объявления переименования подпрограмм
Объявление subprogram_renaming_declaration может служить завершением объявления subprogram_declaration; такое renaming_declaration называется переименованием-как-телом. Объявление subprogram_renaming_declaration, которое не является завершением, называется переименованием-как-объявлением и используется для переименования подпрограммы (возможно, литерала перечисления) или входа.
Синтаксис
subprogram_renaming_declaration ::=
[overriding_indicator]
subprogram_specification renames callable_entity_name
[aspect_specification];
[overriding_indicator]
subprogram_specification renames callable_entity_name
[aspect_specification];
Правила разрешения имен
Ожидаемый профиль для callable_entity_name — это профиль, заданный в subprogram_specification.
Правила легальности
Профиль переименования-как-объявления должен быть согласован по режиму с профилем переименовываемой вызываемой сущности.
Для параметра или результата типа подпрограммы subprogram_specification с явным null_exclusion:
- если callable_entity_name обозначает формальную подпрограмму обобщенной единицы G, и объявление subprogram_renaming_declaration встречается в теле обобщенной единицы G или в теле обобщенной единицы, объявленной в области объявления обобщенной единицы G, то соответствующий параметр или результат типа формальной подпрограммы G должен иметь null_exclusion;
- в противном случае, тип соответствующего параметра или результата переименовываемой вызываемой сущности должен исключать null. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), это правило также применяется в закрытой части экземпляра обобщенной единицы.
Профиль переименования-как-тела должен полностью соответствовать профилю завершаемого им объявления. Если переименование-как-тело завершает это объявление до того, как подпрограмма, которую оно объявляет, заморожена, профиль должен быть согласован по режиму с профилем переименовываемой вызываемой сущности, и подпрограмма, которую оно объявляет, принимает свою конвенцию от переименовываемой подпрограммы; в противном случае профиль должен быть согласован по типу с профилем переименовываемой вызываемой сущности, и конвенция переименовываемой подпрограммы не должна быть Intrinsic. Переименование-как-тело является недопустимым, если объявление происходит до того, как подпрограмма, чье объявление оно завершает, заморожена, и переименование переименовывает саму подпрограмму через одно или несколько объявлений переименования подпрограмм, ни одна из которых не была заморожена.
Идентификатор callable_entity_name переименования не должен обозначать подпрограмму, требующую переопределения (см. 3.9.3).
Идентификатор callable_entity_name переименования-как-тела не должен обозначать абстрактную подпрограмму.
Имя, обозначающее формальный параметр subprogram_specification, не допускается в callable_entity_name.
Статическая семантика
Переименование-как-объявление объявляет новый вид переименовываемой сущности. Профиль этого нового вида берет свои типы, режимы параметров и соглашение о вызове из исходного профиля вызываемой сущности, в то же время беря формальные имена параметров и значения по умолчанию из профиля, заданного в subprogram_renaming_declaration. Новый вид — это функция или процедура, никогда не вход.
Динамическая семантика
При вызове подпрограммы, тело которой задано как переименование-как-тело, выполнение переименования-как-тела эквивалентно выполнению subprogram_body, которое просто вызывает переименовываемую подпрограмму с ее формальными параметрами в качестве фактических параметров и, если это функция, возвращает значение вызова.
При вызове переименования диспетчерской подпрограммы, которая переопределяется, если переопределение произошло до переименования, то выполняемое тело — это тело объявления переопределения, даже если объявление переопределения не видно в месте переименования; в противном случае вызывается унаследованная или предопределенная подпрограмма. Соответствующее правило применяется к вызову переименования предопределенного оператора равенства для немаркированного типа записи.
Ограниченные (временно́й ошибки) ошибки
Если подпрограмма напрямую или косвенно переименовывает сама себя, то вызов этой подпрограммы — это ограниченная ошибка. Возможные последствия — это то, что поднимается Program_Error или Storage_Error, или что вызов приводит к бесконечной рекурсии.
ПРИМЕЧАНИЯ
12 Процедура может быть переименована только как процедура. Функция, определяющий обозначитель которой является либо идентификатором, либо символом оператора, может быть переименована либо идентификатором, либо символом оператора; для переименования как оператора спецификация подпрограммы, заданная в renaming_declaration, подчиняется правилам, заданным в 6.6 для объявлений операторов. Литералы перечислений могут быть переименованы как функции; аналогично, attribute_referenceы, обозначающие функции (такие как ссылки на Succ и Pred), могут быть переименованы как функции. Вход может быть переименован только как процедура; новое имя разрешается только в контекстах, допускающих имя процедуры. Вход семейства может быть переименован, но семейство входов не может быть переименовано целиком.
13 Операторы корневых числовых типов не могут быть переименованы, потому что типы в профиле анонимны, поэтому соответствующие спецификации нельзя написать; то же самое относится к определенным атрибутам, таким как Pos.
14 Вызовы с новым именем переименованного входа являются операторами вызова процедуры и не допускаются в местах, где синтаксис требует оператора вызова входа в conditional_ и timed_entry_callы, ни в asynchronous_select; аналогично, атрибут Count недоступен для нового имени.
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 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 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