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

12.6 Формальные подпрограммы

Формальные подпрограммы могут использоваться для передачи вызываемых сущностей в обобщённый блок.

Синтаксис

formal_subprogram_declaration ::= with subprogram_specification [is subprogram_default];
subprogram_default ::= default_name | <>
default_name ::= name

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

Ожидаемый профиль для default_name, если таковой имеется, — это профиль формальной подпрограммы.
Для обобщённой формальной подпрограммы ожидаемый профиль фактической подпрограммы — это профиль формальной подпрограммы.

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

Профили формальной и любой именованной по умолчанию подпрограммы должны быть совместимы по режиму.
Профили формальной и фактической подпрограмм должны быть совместимы по режиму.

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

formal_subprogram_declaration объявляет обобщённую формальную подпрограмму. Типы формальных параметров и результата (если таковой имеется) формальной подпрограммы определяются метками subtype_mark в formal_subprogram_declaration; однако, независимо от конкретных подтипов, обозначаемых метками subtype_mark, номинальные подтипы формальных параметров и результата (если таковой имеется) определяются как нестатические и несоставленные, если они имеют тип массива (в вызове формальной подпрограммы не предоставляется соответствующая индексная ограничение). В экземпляре formal_subprogram_declaration объявляет вид фактической подпрограммы. Профиль этого вида берёт подтипы и соглашение о вызове из исходного профиля фактической сущности, а имена формальных параметров и значения по умолчанию — из профиля, заданного в formal_subprogram_declaration. Вид является функцией или процедурой, но никогда не является входом.
Если в обобщённом блоке указан subprogram_default с помощью скобок, и соответствующий фактический параметр опущен, то это эквивалентно явному фактическому параметру, являющемуся именем использования, идентичным определяющему имени формального.
ПРИМЕЧАНИЯ
13 Правила сопоставления формальных подпрограмм предъявляют требования, аналогичные требованиям, применяемым к subprogram_renaming_declaration (см. 8.5.4). В частности, имя параметра формальной подпрограммы необязательно должно совпадать с именем соответствующего параметра фактической подпрограммы; аналогично, для этих параметров необязательно соответствие значений по умолчанию.
14 Ограничения, применимые к параметру формальной подпрограммы, — это ограничения соответствующего формального параметра соответствующей фактической подпрограммы (а не те, которые подразумеваются соответствующей меткой subtype_mark в спецификации формальной подпрограммы). Аналогичное замечание относится к результату функции. Поэтому, чтобы избежать путаницы, рекомендуется использовать имя первого подтипа в любом объявлении формальной подпрограммы.
15 Подтип, указанный для формального параметра обобщённой формальной подпрограммы, может быть любым видимым подтипом, включая обобщённый формальный подтип того же generic_formal_part.
16 Формальная подпрограмма сопоставляется с атрибутом типа, если атрибут является функцией с соответствующей спецификацией. Перечисление литерал данного типа соответствует безаргументной формальной функции, результат которой — данный тип.
17 default_name обозначает сущность, которая видима или непосредственно видима в месте generic_declaration; скобки, используемые в качестве значения по умолчанию, эквивалентны имени, которое обозначает сущность, непосредственно видимую в месте _instantiation.
18 Фактическая подпрограмма не может быть абстрактной (см. 3.9.3).

Примеры

Примеры обобщённых формальных подпрограмм:
with function "+"(X, Y : Item) return Item is <>;
with function Image(X : Enum) return String is Enum'Image;
with procedure Update is Default_Update;
-- задано объявление обобщённой процедуры
generic
with procedure Action (X : in Item);
procedure Iterate(Seq : in Item_Sequence);
-- и процедура
procedure Put_Item(X : in Item);
-- следующее создание возможно
procedure Put_List is new Iterate(Action => Put_Item);


Spec-Zone.ru

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