Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

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];

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

Ожидаемый профиль для 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 переименования-как-тела не должно обозначать абстрактную подпрограмму.
Если callable_entity_name переименования является префиксом представления, префикс этого представления должен обозначать объект, для которого разрешено переименование.
Имя, обозначающее формальный параметр subprogram_specification, не допускается в имени callable_entity_name.

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

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

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

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

Ограниченные (временно́й) ошибки

Если подпрограмма напрямую или косвенно переименовывает себя, то вызов этой подпрограммы является ограниченной ошибкой. Возможными последствиями являются то, что поднимается Program_Error или Storage_Error, или что вызов приводит к бесконечной рекурсии.
ПРИМЕЧАНИЕ 1 Процедура может быть переименована только как процедура. Функция, чьё defining_designator является либо identifier, либо operator_symbol, может быть переименована либо identifier, либо operator_symbol; для переименования в качестве оператора спецификация подпрограммы, заданная в renaming_declaration, подчиняется правилам, заданным в 6.6 для объявлений операторов. Литералы перечисления могут быть переименованы как функции; аналогично, attribute_references, обозначающие функции (например, ссылки на Succ и Pred), могут быть переименованы как функции. Вход может быть переименован только как процедура; новое имя name допускается только в контекстах, допускающих имя процедуры name. Вход семьи может быть переименован, но семья входов не может быть переименована целиком.
ПРИМЕЧАНИЕ 2 Операторы корневых числовых типов не могут быть переименованы, потому что типы в профиле являются анонимными, поэтому соответствующие спецификации нельзя записать; то же самое относится к определённым атрибутам, таким как Pos.
Этот абзац был удалён.
ПРИМЕЧАНИЕ 3 Примитивность объявления переименования определяется его профилем и местоположением, как и в случае любого объявления (представления) подпрограммы; примитивность не определяется переименованным представлением. Для выполнения диспетчеризованного вызова имя подпрограммы должно обозначать примитивную подпрограмму, а не не примитивное переименование примитивной подпрограммы.

Примеры

Примеры объявлений переименования подпрограмм:
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