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

12.3 Обобщенная инициализация

Экземпляр обобщенного блока объявляется с помощью обобщенной_инициализации.

Синтаксис

обобщенная_инициализация ::=
package имя_определяемого_блока is
new обобщенное_пакетное_имя [часть_фактических_обобщенных_параметров];
| [индикатор_переопределения]
procedure имя_определяемого_блока is
new обобщенное_процедурное_имя [часть_фактических_обобщенных_параметров];
| [индикатор_переопределения]
function определяющее_имя is
new обобщенное_функциональное_имя [часть_фактических_обобщенных_параметров];
часть_фактических_обобщенных_параметров ::=
(ассоциация_обобщенного_параметра {, ассоциация_обобщенного_параметра})
ассоциация_обобщенного_параметра ::=
[формальный_параметр_обобщения_имя_селектора =>] явный_фактический_обобщенный_параметр
явный_фактический_обобщенный_параметр ::= выражение | переменная_имя
| подпрограмма_имя | имя_входа | метка_типа
| имя_экземпляра_пакета
Ассоциация обобщенного параметра является именованной или позиционной в зависимости от того, указано ли формальный_параметр_обобщения_имя_селектора. Любые позиционные ассоциации должны предшествовать любым именованным ассоциациям.
Фактический параметр обобщения — это либо явный_фактический_обобщенный_параметр, заданный в ассоциации_обобщенного_параметра для каждого формального параметра, либо соответствующее значение_по_умолчанию или имя_по_умолчанию, если для формального параметра не задана ассоциация_обобщенного_параметра. Когда смысл понятен из контекста, термин «фактический обобщенный параметр» или просто «фактический» используется как синоним для «фактический обобщенный параметр», а также для вида, обозначаемого одним, или значения одного.

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

В обобщенной_инициализации для определенного типа блоков программы (пакета, процедуры или функции) имя должно обозначать обобщенный блок соответствующего типа (обобщенный пакет, обобщенная процедура или обобщенная функция соответственно).
формальный_параметр_обобщения_имя_селектора ассоциации обобщенного параметра должно обозначать объявление_формального_обобщенного_параметра обобщенного блока, который инициализируется. Если две или более формальные подпрограммы имеют одинаковое имя определения, то для соответствующих фактических параметров не допускаются именованные ассоциации.
обобщенная_инициализация должна содержать не более одной ассоциации_обобщенного_параметра для каждого формального параметра. Каждый формальный параметр без ассоциации должен иметь значение_по_умолчанию или значение_подпрограммы_по_умолчанию.
В обобщенном блоке правила корректности применяются на этапе компиляции объявления_обобщения и обобщенного тела, учитывая свойства формальных параметров. В видимой части и части формальных параметров экземпляра правила корректности применяются на этапе компиляции обобщенной_инициализации, учитывая свойства фактических параметров. В других частях экземпляра правила корректности не применяются; это правило не относится к случаям, когда данное правило явно указывает на иное.
Обобщенная инициализация объявляет экземпляр; она эквивалентна объявлению экземпляра (объявлению пакета или объявлению подпрограммы) непосредственно после тела экземпляра, в месте инициализации.
Экземпляр представляет собой копию текста шаблона. Каждое использование формального параметра становится (в копии) использованием фактического, как объяснено ниже. Экземпляр обобщенного пакета является пакетом, обобщенной процедуры — процедурой, а обобщенной функции — функцией.
Интерпретация каждого конструкта в объявлении или теле обобщения определяется с помощью правил перегрузки при компиляции этого объявления или тела обобщения. В экземпляре интерпретация каждого (скопированного) конструкта одинакова, за исключением имени, обозначающего объявление обобщения или какое-либо объявление внутри обобщенного блока; соответствующее имя в экземпляре затем обозначает соответствующую копию обозначаемого объявления. Правила перегрузки не применяются в экземпляре.
В экземпляре объявление формального обобщенного параметра объявляет представление, свойства которого идентичны свойствам фактического, за исключением того, что указано в 12.4, «Формальные объекты» и 12.6, «Формальные подпрограммы». Аналогично, для объявления внутри объявления формального обобщенного параметра соответствующее объявление в экземпляре объявляет представление, свойства которого идентичны соответствующему объявлению в объявлении фактического.
Неявные объявления также копируются, и имя, обозначающее неявное объявление в обобщении, обозначает соответствующую копию в экземпляре. Однако для типа, объявленного в видимой части обобщения, для использования вне экземпляра неявно объявляется новый набор примитивных подпрограмм, который может отличаться от скопированного набора, если свойства типа каким-либо образом зависят от свойств указанного в инициализации фактического типа. Например, если тип в обобщении происходит от формального частного типа, то в экземпляре тип будет наследовать подпрограммы от соответствующего фактического типа.
Эти новые неявные объявления появляются сразу после объявления типа в экземпляре и переопределяют скопированные. Скопированные могут вызываться только изнутри экземпляра; новые — только извне экземпляра, хотя для помеченных типов тело нового может быть выполнено вызовом старому.
В видимой части экземпляра явное объявление переопределяет неявное, если они являются одноименными, как описано в 8.3. С другой стороны, явное объявление в частной части экземпляра переопределяет неявное объявление в экземпляре только в том случае, если соответствующее явное объявление в обобщении переопределяет соответствующее неявное объявление в обобщении. Соответствующие правила применяются к другим видам переопределения, описанным в 8.3.

Правила после компиляции

Рекурсивную обобщенную инициализацию запрещено использовать в следующем смысле: если данный обобщенный блок включает инициализацию второго обобщенного блока, то экземпляр, сгенерированный этой инициализацией, не должен включать экземпляр первого обобщенного блока (будь то прямой или косвенный экземпляр через промежуточные инициализации).

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

Для обработки обобщенной_инициализации каждый ассоциация_обобщенного_параметра сначала оценивается. Если используется значение по умолчанию, предполагается неявная ассоциация_обобщенного_параметра для этого правила. Эти оценки выполняются в произвольном порядке, за исключением случаев, когда оценка фактического параметра по умолчанию выполняется после оценки другого фактического параметра, если значение по умолчанию включает имя, обозначающее другой фактический параметр. Наконец, обрабатываются объявление и тело экземпляра.
Для оценки generic_association вычисляется обобщённый фактический параметр. Дополнительные действия выполняются в случае формального объекта с режимом in (см. 12.4).
ПРИМЕЧАНИЯ
5 Если формальный тип не помечен, то тип обрабатывается как немаркированный тип внутри тела обобщения. Наследование от такого типа в теле обобщения разрешено; новый тип не получает новое значение метки, даже если фактический тип помечен. Переопределённые операции для такого производного типа не могут быть вызваны извне экземпляра.

Примеры

Примеры обобщённых инстанциаций (см. 12.1):
procedure Swap is new Exchange(Elem => Integer);
procedure Swap is new Exchange(Character); -- Swap перегружен
function Square is new Squaring(Integer); -- "*" целого числа используется по умолчанию
function Square is new Squaring(Item => Matrix, "*" => Matrix_Product);
function Square is new Squaring(Matrix, Matrix_Product); -- то же, что и предыдущее
package Int_Vectors is new On_Vectors(Integer, Table, "+");
Примеры использования созданных единиц:
Swap(A, B);
A := Square(A);
T : Table(1 .. 5) := (10, 20, 30, 40, 50);
N : Integer := Int_Vectors.Sigma(T); -- 150 (см. 12.2, «Обобщённые тела» для тела Sigma)
use Int_Vectors;
M : Integer := Sigma(T); -- 150


Spec-Zone.ru

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