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

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;
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). Имя объявляемой общей подпрограммы должно быть identifier (а не operator_symbol).

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

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

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

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

Примеры

Примеры частей с формальными параметрами:
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