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

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_declaration не оказывает влияния.
ПРИМЕЧАНИЯ
1 Вне общего устройства имя, обозначающее generic_declaration, обозначает общее устройство. В отличие от этого, в области объявления общего устройства имя, обозначающее generic_declaration, обозначает текущий экземпляр.
2 В теле общей subprogram_body имя этого блока программ действует как имя подпрограммы. Следовательно, это имя может быть перегружено, и оно может появиться в рекурсивном вызове текущего экземпляра. По той же причине это имя не может появиться после служебного слова new в (рекурсивном) generic_instantiation.
3 default_expression или default_name, появляющиеся в 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