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

12.1 Обобщенные объявления

Объявление generic_declaration объявляет обобщенную единицу, которая является либо обобщенной подпрограммой, либо обобщенным пакетом. Объявление generic_declaration включает generic_formal_part, объявляющий любые формальные параметры обобщения. Формальный параметр обобщения может быть объектом; в альтернативном случае (в отличие от параметра подпрограммы) он может быть типом, подпрограммой или пакетом.

Синтаксис

generic_declaration ::=
generic_subprogram_declaration | generic_package_declaration
generic_subprogram_declaration ::=
generic_formal_part subprogram_specification
[aspect_specification];
generic_package_declaration ::=
generic_formal_part package_specification;
generic_formal_part ::=
generic {generic_formal_parameter_declaration | use_clause}
generic_formal_parameter_declaration ::=
formal_object_declaration
| formal_type_declaration
| formal_subprogram_declaration
| formal_package_declaration
Единственная форма subtype_indication, разрешенная в generic_formal_part, — это subtype_mark (то есть, subtype_indication не должна включать явное constraint). Имя обобщенной подпрограммы должно быть идентификатором (а не символом оператора).

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

Объявление generic_declaration объявляет обобщенную единицу — обобщенный пакет, обобщенную процедуру или обобщенную функцию, соответственно.
Сущность является формальной обобщенной сущностью, если она объявлена объявлением generic_formal_parameter_declaration. «Формальный обобщенный», или просто «формальный», используется как префикс применительно к объектам, подтипам (и типам), функциям, процедурам и пакетам, которые являются формальными сущностями обобщения, а также к их соответствующим объявлениям. Примеры: «формальная обобщенная процедура» или «формальное объявление целого типа».
Список generic_formal_parameter_declaration объявления generic_formal_part образует список объявлений обобщенной единицы.

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

Выполнение объявления generic_declaration не оказывает никакого влияния.
ПРИМЕЧАНИЕ 1 Вне обобщенной единицы имя, обозначающее generic_declaration, обозначает обобщенную единицу. В отличие от этого, внутри области объявления обобщенной единицы имя, обозначающее generic_declaration, обозначает текущий экземпляр.
ПРИМЕЧАНИЕ 2 Внутри тела обобщенной подпрограммы subprogram_body имя этого блока программы действует как имя подпрограммы. Следовательно, это имя может быть перегружено, и оно может появиться в рекурсивном вызове текущего экземпляра. По той же причине это имя не может появиться после зарезервированного слова new в (рекурсивной) generic_instantiation.
ПРИМЕЧАНИЕ 3 default_expression или default_name, появляющиеся в generic_formal_part, не вычисляются во время выполнения generic_formal_part; вместо этого они вычисляются при использовании. Однако обычные правила видимости применяются к любому имени, используемому в значении по умолчанию, с разрешением имен, выполняемым на основе расположения имени в generic_formal_part.

Примеры

Примеры формальных частей обобщения:
generic -- без параметров
generic
Size : Natural; -- формальный объект
generic
Length : Integer := 200; -- формальный объект со значением по умолчанию
Area : Integer := Length*Length; -- формальный объект со значением по умолчанию
generic
type Item is private; -- формальный тип
type Index is (<>); -- формальный тип
type Row is array(Index range <>) of Item; -- формальный тип
with function "<"(X, Y : Item) return Boolean; -- формальная подпрограмма
Примеры объявления обобщенных подпрограмм Exchange и Squaring:
generic
type Elem is private;
procedure Exchange(U, V : in out Elem);
generic
type Item (<>) is private;
with function "*"(U, V : Item) return Item is <>;
function Squaring(X : Item) return Item;
Пример объявления обобщенного пакета:
generic
type Item is private;
type Vector is array (Positive range <>) of Item;
with function Sum(X, Y : Item) return Item;
package On_Vectors is
function Sum (A, B : Vector) return Vector;
function Sigma(A : Vector) return Item;
Length_Error : exception;
end On_Vectors;


Spec-Zone.ru

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