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

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

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

Синтаксис

объявление_переименования_подпрограммы ::= спецификация_подпрограммы renames имя_вызываемого_сущности_имя;

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

Ожидаемый профиль для имя_вызываемого_сущности_имя — это профиль, указанный в спецификации_подпрограммы.

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

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

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

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

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

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

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

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

Примеры

Примеры объявлений переименования подпрограмм:
процедура My_Write(C : вход Символ) renames Pool(K).Write; -- см. 4.1.3
функция Real_Plus(Left, Right : Real ) return Real renames "+";
функция Int_Plus (Left, Right : Целое) return Целое renames "+";
функция Rouge return Цвет renames Red; -- см. 3.5.1
функция Rot return Цвет renames Red;
функция Rosso return Цвет renames Rouge;
функция Next(X : Цвет) return Цвет renames Color'Succ; -- см. 3.5.1
Пример объявления переименования подпрограммы с новыми именами параметров:
функция "*" (X,Y : Вектор) return Вещественное renames Dot_Product; -- см. 6.1
Пример объявления переименования подпрограммы с новым значением по умолчанию:
функция Minimum(L : Ссылка := Голова) return Ячейка renames Min_Cell; -- см. 6.1


Spec-Zone.ru

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