procedure ЗАМЕНА (A, В: in out ЭЛЕМ);
generic
type ЭЛЕМЕНТ is private;
with function (А, В: ЭЛЕМЕНТ) return ЭЛЕМЕНТ is < >;
function BO3B. В_КВАДРАТ (X: ЭЛЕМЕНТ) return ЭЛЕМЕНТ;
Пример описания настройки с настраиваемым пакетом:
generic
type ЭЛЕМЕНТ is private;
type ВЕКТОР is array (POSITIVE range < >) of ЭЛЕМЕНТ;
with function СУММА (X, Y: ЭЛЕМЕНТ) return ЭЛЕМЕНТ;
package НАД_ВЕКТОРАМИ is
function СУММА (А, В: ВЕКТОР) return ВЕКТОР;
function СИГМА (А: ВЕКТОР) return ЭЛЕМЕНТ;
ОШИБОЧНАЯ_ДЛИНА: exception;
end;
Примечание. Внутри тела настраиваемой подпрограммы ее имя рассматривается как имя подпрограммы. Следовательно, это имя может быть совмещено, а также может появиться в рекурсивном вызове текущей конкретизации. По этой же причине его нельзя использовать после зарезервированного слова new в (рекурсивной) конкретизации настройки.
Выражение, которое находится в разделе формальных параметров настройки, - это выражение по умолчанию для формального параметра вида in, либо составная часть имени входа, заданного как имя по умолчанию для формальной подпрограммы, либо выражение по умолчанию для параметра формальной подпрограммы. В первых двух случаях значение этого выражения вычисляется только в тех конкретизациях, в которых используется соответствующее умолчание. В третьем случае значение выражения вычисляется только в вызовах формальных подпрограмм, использующих такое умолчание. (К любому имени, используемому в выражении по умолчанию, применяются обычные правила видимости: обозначенные этим именем понятия должны быть видимы в том месте, где стоит выражение.)
Ни формальные параметры настройки, ни их атрибуты в качестве частей статических выражений не допустимы (см. 4.9).
.Формальные объекты настройки
Первая форма описания формального параметра настройки задает формальные объекты настройки. Тип формального объекта настройки — это базовый тип обозначения типа, данного в описании формального параметра настройки. Описание формального параметра настройки с несколькими идентификаторами эквивалентно последовательности единичных описаний, как поясняется в разд. 3.2.
Формальный объект настройки имеет вид in или in out. При отсутствии в описании формального параметра настройки явного указания вида подразумевается вид in. Если в описании формального параметра настройки задано выражение, то оно является выражением по умолчанию для этого формального параметра. Выражение по умолчанию допустимо только для параметров вида in (указанного либо явно, либо неявно). Тип выражения по умолчанию должен быть таким же, как и у соответствующего формального параметра настройки.
Формальный объект настройки вида in — это константа, значение которой является копией значения сопоставленного ему фактического параметра конкретизации настройки, как описано в разд. 12.3. Тип формального объекта настройки вида in не должен быть лимитируемым типом; подтип такого формального объекта настройки — это подтип в обозначении типа, данного в описании параметра настройки.
Формальный объект настройки вида in out — это переменная, обозначающая объект, задаваемый в конкретизации настройки фактическим параметром настройки, как описано в разд. 12.3. Ограничения, применяемые к формальному объекту настройки, те же, что и для соответствующего фактического параметра.
Примечание. Ограничения, применяемые к формальному объекту настройки вида in out, те же, что и для соответствующего фактического параметра (а не те, которые связаны с обозначением типа из описания параметра настройки). Во избежание путаницы рекомендуется, когда это возможно, использовать в описании такого формального объекта имя базового типа. Если, однако, базовый тип анонимен, то рекомендуется использовать имя подтипа, определенного в описании базового типа.
. Ф о р м а л ь н ы е типы настройки
Описание параметра настройки, включающее определение настраиваемого типа или описание личного типа, задает формальный тип настройки. Формальный тип настройки обозначает подтип, заданный соответствующим фактическим параметром в конкретизации настройки, как описано в разд. 12.3 г. В настраиваемом модуле формальный тип настройки рассматривается как некоторый уникальный тип, отличный от всех остальных (формальных или нет) типов. Форма ограничения, применимого к формальному типу в указании подтипа, зависит от класса типа, как и для типов, не являющихся формальными.
В описании формального (ограниченного) индексируемого типа настройки в качестве формы дискретного диапазона допустимо только обозначение типа.
Раздел дискриминантов формального личного типа настройки не должен включать выражение по умолчанию для дискриминанта. (Следовательно, переменная, заданная описанием объекта, должна быть ограничена, если ее тип — это формальный тип настройки с дискриминантами.)
В описании и теле настраиваемого модуля операции, которые можно выполнять над значениями формального типа настройки (кроме дополнительных операций, заданных формальными подпрограммами настройки), определяются описанием параметра настройки для этого формального типа:
Для описания личного типа разрешены операции, определенные в разд. 7.4.2 (в частности, для личного, но не лимитируемого, типа — присваивание, равенство и неравенство).
Для определения индексируемого типа разрешены операции, определенные в разд. 3.6.2 (например, они включают формирование индексируемых компонентов и отрезков).
Для определения ссылочного типа разрешены операции, определенные в разд, 3.8.2 (например, могут быть использованы генераторы).
Четыре формы определения настраиваемого типа, в которых содержится бокс (т. е. составной ограничитель < >), соответствуют следующим основным формам скалярного типа:
Дискретные типы: (О).
Разрешенные операции — общие для перечислимых и целых типов; они определены в разд. 3.5.5.
Целые типы: range < >.
Разрешенные операции над целыми типами определены в разд. 3.5.5. е) Плавающие типы: digits О.
Разрешенные операции определены в разд. 3.5.8.
ж) Фиксированные типы: delta О.
Разрешенные операции определены в разд. 3.5.10.
Во всех случаях, от а до е, каждая операция, неявно связанная с формальным типом (т. е. отличная от операции, заданной формальной подпрограммой) , считается неявно описанной в месте описания формального типа. Это же относится и к формальному фиксированному типу, исключая мультипликативные операции, которые возвращают результат универсального _ фиксированного типа (см. 4.5.5), так как эти специальные операции описаны в пакете STANDARD.
При конкретизации настройки каждая из этих операций — это соответствующая базовая операция или предопределенная операция для сопоставленного фактического типа. Для операции это правило сохраняется даже в случае переопределения ее для фактического типа или некоторого его родительского типа.
Примеры формальных типов настройки:
type ЭЛЕМЕНТ is private;
type БУФЕР (ДЛИНА: NATURAL) is limited private;
type ПЕРЕЧИСЛ is (< >);
type ЦЕЛ is range < >;
type УГОЛ is delta < >;
type МАССА is digits < >;
type ТАБЛИЦА is array (ПЕРЕЧИСЛ) of ЭЛЕМЕНТ;
Пример раздела формальных параметров настройки с описанием формального целого типа:
generic
type РЯД is range < >;
ПЕРВЫЙ: РЯД: = PHfl'FIRST;
ВТОРОЙ: РЯД: = ПЕРВЫЙ + 1; - - операция ”+” для типа РЯД
. Ф о р м а л ь н ы е подпрограммы настройки
Описание параметра настройки, включающее спецификацию подпрограммы, описывает формальную подпрограмму настройки.
В описании формальной подпрограммы настройки могут встречаться две формы умолчания. В них после спецификации подпрограммы следует зарезервированное слово is и либо бокс, либо имя подпрограммы или входа. Правила сопоставления для таких умолчаний описаны в разд. 12.3.6.
Формальная подпрограмма настройки обозначает подпрограмму, литерал перечисления или вход, заданный соответствующим фактическим параметром настройки в конкретизации настройки, как описано в разд. 12.3 е.
Примеры формальных подпрограмм настройки:
with function УВЕЛИЧИТЬ (X: INTEGER) return INTEGER;
with function СУММА (X, У: ЭЛЕМЕНТ) return ЭЛЕМЕНТ;
with function ”+” (X, Y: ЭЛЕМЕНТ) return ЭЛЕМЕНТ is < >;
with function ОБРАЗ (X: ПЕРЕЧИСЛ) return STRING is ПЕРЕЧИСЛ' IMAGE;
with procedure ОБНОВЛЕНИЕ is ОБНОВЛЕНИЕ_ПО_УМОЛЧАНИЮ;
Примечание. Ограничения на параметр формальной подпрограммы те же, что у соответствующего параметра в спецификации сопоставленной фактической подпрограммы (а не те, которые вводятся соответствующим обозначением типа в спецификации формальной подпрограммы). Это же относится и к результату функции. Во избежание путаницы рекомендуется везде, где можно, в описании формальной подпрограммы использовать имя базового типа, а не имя подтипа. Если, однако, базовый тип анонимен, то рекомендуется использовать имя подтипа, определенное в описании типа.
Тип, заданный для формального параметра формальной подпрограммы настройки, может быть любым видимым типом, включая формальный тип настройки из того же раздела формальных параметров настройки.
Настраиваемое тело
Тело настраиваемой подпрограммы или настраиваемого пакета (настраиваемое тело) является шаблоном для тел соответствующих подпрограмм или пакетов, получаемых конкретизацией настройки. Синтаксис настраиваемого тела идентичен обычному телу.
Для каждого описания настраиваемой подпрограммы должно быть соответствующее тело.
Предвыполнение настраиваемого тела не имеет другого эффекта, кроме установления того, что тело, начиная с этого момента, может быть использовано в качестве шаблона для получения соответствующих экземпляров.
Пример настраиваемого тела процедуры:
procedure ЗАМЕНА (А, В: in out ЭЛЕМ) is - - см. пример в 12.1
ЭЛЕМ; - - формальный тип настройки
begin
= А;
= В;
= Т;
end ЗАМЕНА;
Пример тела настраиваемой функции:
function ВОЗВ_В_КВАДРАТ (X: ЭЛЕМЕНТ) return ЭЛЕМЕНТ is
begin --см. пример в 12.1
return X * X; --формальная операция
end;
Пример тела настраиваемого пакета:
package body НАД_ВЕКТОРАМИ is - - см. пример в 12.1
function СУММА (А, В: ВЕКТОР) return ВЕКТОР is
РЕЗУЛЬТАТ: ВЕКТОР (A'RANGE); - - формальный тип ВЕКТОР
СМЕЩЕНИЕ: constant INTEGER: = B'FIRST - A'FIRST;
begin
if A'LENGTH / = B'LENGTH then
raise ОШИБОЧНАЯ_ДЛИНА;
end if;
for К in A'RANGE loop
РЕЗУЛЬТАТ (К): = СУММА (А(К), B(K + СМЕЩЕНИЕ));
- формальная функция СУММА
end loop;
return РЕЗУЛЬТАТ;
end;
function СИГМА (А: ВЕКТОР) return ЭЛЕМЕНТ is
ИТОГ: ЭЛЕМЕНТ: = A (A'FIRST); - - формальный тип ЭЛЕМЕНТ begin
for К in A'FIRST + 1. .A'LAST loop
ИТОГ: = СУММА (ИТОГ, А (К)); - - формальная функция СУММА end loop;
return ИТОГ;
end;
end;
Конкретизация настройки
Экземпляр настраиваемого модуля описывается конкретизацией настройки.
конкретизация—настройки : : =
package идентификатор is new тля настраиваемого пакета [раздел_фактических_параметров_настройки] •
I procedure идентификатор is new
тлянастраиваемой процедуры
[раздел—фактических—параметров—настройки];
I function обозначение is new тля_настраиваемой_функции [раздел_фактических—параметров—настройки];
раздел—фактических—ПараметроВ—настройки : : = (сопоставление_параметров_настройки
<, сопоставление—параметров—настройки})
сопоставление—параметров—настройки : : = [формальный—параметр—настройки => ] фактический—параметр—настройки
формальный—параметр—настройки ; : =
простое—имя—параметра | знак_операции
фактический—параметр—настройки : : = выражение
I имя— переменной I имя—подпрограммы
I имя—входа I обозначение_типа
Для каждого формального параметра настройки должен быть задан явный фактический параметр настройки, кроме случая, когда соответствующим описанием параметра настройки задана форма умолчания. Сопоставление параметров настройки может быть либо позиционным, либо именованным (как в вызове подпрограммы (см, 6.4) ). Если две или несколько формальных подпрограмм имеют одно и то же обозначение, то для соответствующих параметров настройки именованные сопоставления недопустимы.
Каждый фактический параметр настройки должен быть сопоставлен с соответствующим формальным параметром. Выражение может быть сопоставлено с формальным объектом вида in; имя переменной может быть сопоставлено с формальным объектом вида in out; имя подпрограммы или имя входа может сопоставляться с формальной подпрограммой; обозначение типа может сопоставляться с формальным типом. Детальные правила, определяющие единственные допустимые сопоставления, даны в разд. 12.3.1-12.3.6.
Экземпляр — это копия настраиваемого модуля без его раздела формальных параметров настройки; таким образом, экземпляр настраиваемого пакета — пакет, настраиваемой процедуры — процедура, настраиваемой функции — функция. Для каждого вхождения обозначающего данное понятие имени в настраиваемый модуль следующий список определяет, какое понятие соответствует этому имени в экземпляре.
Имя обозначает этот настраиваемый модуль; соответствующее вхождение обозначает экземпляр.
Имя обозначает формальный объект настройки вида in; соответствующее в экземпляре имя обозначает константу, значение которой — копия значения сопоставленного фактического параметра настройки.
Имя обозначает формальный объект настройки вида in out; соответствующее в экземпляре имя обозначает переменную, указанную сопоставленным фактическим параметром настройки.
Имя обозначает формальный тип настройки; соответствующее в экземпляре имя обозначает подтип, указанный сопоставленным фактическим параметром настройки (фактическим подтипом).
Имя обозначает дискриминант формального типа настройки; соответствующее в экземпляре имя обозначает соответствующий дискриминант (он должен быть один) фактического типа, сопоставленного формальному типу настройки.
Имя обозначает формальную подпрограмму настройки; соответствующее в экземпляре имя обозначает подпрограмму, литерал перечисления или вход, указанный сопоставленным фактическим параметром настройки (фактической подпрограммой).
Имя обозначает формальный параметр формальной подпрограммы настройки; соответствующее в экземпляре имя обозначает соответствующий формальный параметр фактической подпрограммы, соответствующей формальной подпрограмме.
Имя обозначает локальное понятие, описанное в настраиваемом модуле; соответствующее в экземпляре имя обозначает понятие, описанное соответствующим локальным описанием в экземпляре.
Имя обозначает глобальное понятие, описанное вне настраиваемого модуля; соответствующее в экземпляре имя обозначает это же глобальное понятие.