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

12.7 Формальные пакеты

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

Синтаксис

formal_package_declaration ::=
with package defining_identifier is new generic_package_name formal_package_actual_part;
formal_package_actual_part ::=
([others =>] <>)
| [generic_actual_part]
| (formal_package_association {, formal_package_association} [, others => <>])
formal_package_association ::=
generic_association
| generic_formal_parameter_selector_name => <>
Любые позиционные formal_package_association должны предшествовать любым именованным formal_package_association.

Правила законности

generic_package_name должен обозначать генерический пакет (шаблон для формального пакета); формальный пакет является экземпляром шаблона.
formal_package_actual_part должен содержать не более одной formal_package_association для каждого формального параметра. Если formal_package_actual_part не включает «others => <>», каждый формальный параметр без ассоциации должен иметь default_expression или subprogram_default.
Фактический пакет должен быть экземпляром шаблона. Если formal_package_actual_part является (<>) или (others => <>), то фактический пакет может быть любым экземпляром шаблона; в противном случае определенные фактические параметры фактического экземпляра должны соответствовать соответствующим фактическим параметрам формального пакета, определяемым следующим образом:
  • Если formal_package_actual_part включает generic_associations и ассоциации с <>, то только фактические параметры, явно указанные с помощью generic_associations, обязаны соответствовать;
  • В противном случае все фактические параметры должны соответствовать, независимо от того, указан ли фактический параметр явно или по умолчанию.
Правила сопоставления фактических параметров между фактическим экземпляром и формальным пакетом следующие:
  • Для формального объекта с режимом in фактические значения соответствуют, если они являются статическими выражениями с одинаковым значением, или если они статически обозначают ту же константу, или если они оба являются литералом null.
  • Для формального подтипа фактические значения соответствуют, если они обозначают статически совпадающие подтипы.
  • Для других типов формальных параметров, фактические значения соответствуют, если они статически обозначают ту же сущность.
Для целей сопоставления любой фактический параметр, являющийся именем формального объекта с режимом in, заменяется фактическим выражением формального объекта (рекурсивно).

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

A formal_package_declaration объявляет формальный генерический пакет.
Видимая часть формального пакета включает первый список basic_declarative_item в package_specification. Кроме того, для каждого фактического параметра, который не должен соответствовать, копия объявления соответствующего формального параметра шаблона включается в видимую часть формального пакета. Если скопированное объявление относится к формальному типу, копии неявных объявлений примитивных подпрограмм формального типа также включаются в видимую часть формального пакета.
Для целей сопоставления, если фактический экземпляр A сам является формальным пакетом, то фактические параметры A задаются явно или неявно в formal_package_actual_part для A, плюс, для тех, которые не указаны, копии формальных параметров шаблона, включённые в видимую часть A.

Примеры

Пример генерического пакета с параметрами формальных пакетов:
with Ada.Containers.Ordered_Maps; -- см. A.18.6
generic
with package Mapping_1 is new Ada.Containers.Ordered_Maps(<>);
with package Mapping_2 is new Ada.Containers.Ordered_Maps
(Key_Type => Mapping_1.Element_Type,
others => <>);
package Ordered_Join is
-- Обеспечить "соединение" между двумя отображениями
subtype Key_Type is Mapping_1.Key_Type;
subtype Element_Type is Mapping_2.Element_Type;
function Lookup(Key : Key_Type) return Element_Type;
...
end Ordered_Join;




Пример инстанцирования пакета с формальными пакетами:
with Ada.Containers.Ordered_Maps;
package Symbol_Package is
type String_Id is ...
type Symbol_Info is ...
package String_Table is new Ada.Containers.Ordered_Maps
(Key_Type => String,
Element_Type => String_Id);
package Symbol_Table is new Ada.Containers.Ordered_Maps
(Key_Type => String_Id,
Element_Type => Symbol_Info);
package String_Info is new Ordered_Join(Mapping_1 => String_Table,
Mapping_2 => Symbol_Table);
Apple_Info : constant Symbol_Info := String_Info.Lookup("Apple");
end Symbol_Package;


Spec-Zone.ru

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