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).

  1. .Формальные объекты настройки

Первая форма описания формального параметра настройки задает фор­мальные объекты настройки. Тип формального объекта настройки — это ба­зовый тип обозначения типа, данного в описании формального параметра настройки. Описание формального параметра настройки с несколькими идентификаторами эквивалентно последовательности единичных описаний, как поясняется в разд. 3.2.

Формальный объект настройки имеет вид in или in out. При отсутствии в описании формального параметра настройки явного указания вида подра­зумевается вид in. Если в описании формального параметра настройки зада­но выражение, то оно является выражением по умолчанию для этого фор­мального параметра. Выражение по умолчанию допустимо только для пара­метров вида in (указанного либо явно, либо неявно). Тип выражения по умолчанию должен быть таким же, как и у соответствующего формального параметра настройки.

Формальный объект настройки вида in — это константа, значение кото­рой является копией значения сопоставленного ему фактического парамет­ра конкретизации настройки, как описано в разд. 12.3. Тип формального объекта настройки вида in не должен быть лимитируемым типом; подтип такого формального объекта настройки — это подтип в обозначении типа, данного в описании параметра настройки.

Формальный объект настройки вида in out — это переменная, обознача­ющая объект, задаваемый в конкретизации настройки фактическим пара­метром настройки, как описано в разд. 12.3. Ограничения, применяемые к формальному объекту настройки, те же, что и для соответствующего фак­тического параметра.

Примечание. Ограничения, применяемые к формальному объекту настройки вида in out, те же, что и для соответствующего фактического параметра (а не те, которые связаны с обозначением типа из описания параметра настройки). Во избежание путани­цы рекомендуется, когда это возможно, использовать в описании такого формального объекта имя базового типа. Если, однако, базовый тип анонимен, то рекомендуется использовать имя подтипа, определенного в описании базового типа.

  1. . Ф о р м а л ь н ы е типы настройки

Описание параметра настройки, включающее определение настраивае­мого типа или описание личного типа, задает формальный тип настройки. Формальный тип настройки обозначает подтип, заданный соответствующим фактическим параметром в конкретизации настройки, как описано в разд. 12.3 г. В настраиваемом модуле формальный тип настройки рассматривает­ся как некоторый уникальный тип, отличный от всех остальных (формаль­ных или нет) типов. Форма ограничения, применимого к формальному ти­пу в указании подтипа, зависит от класса типа, как и для типов, не являю­щихся формальными.

В описании формального (ограниченного) индексируемого типа на­стройки в качестве формы дискретного диапазона допустимо только обо­значение типа.

Раздел дискриминантов формального личного типа настройки не дол­жен включать выражение по умолчанию для дискриминанта. (Следователь­но, переменная, заданная описанием объекта, должна быть ограничена, если ее тип — это формальный тип настройки с дискриминантами.)

В описании и теле настраиваемого модуля операции, которые можно выполнять над значениями формального типа настройки (кроме дополни­тельных операций, заданных формальными подпрограммами настройки), определяются описанием параметра настройки для этого формального типа:

  1. Для описания личного типа разрешены операции, определенные в разд. 7.4.2 (в частности, для личного, но не лимитируемого, типа — присваи­вание, равенство и неравенство).

  2. Для определения индексируемого типа разрешены операции, опре­деленные в разд. 3.6.2 (например, они включают формирование индекси­руемых компонентов и отрезков).

  3. Для определения ссылочного типа разрешены операции, определен­ные в разд, 3.8.2 (например, могут быть использованы генераторы).

Четыре формы определения настраиваемого типа, в которых содержит­ся бокс (т. е. составной ограничитель < >), соответствуют следующим ос­новным формам скалярного типа:

  1. Дискретные типы: (О).

Разрешенные операции — общие для перечислимых и целых типов; они определены в разд. 3.5.5.

  1. Целые типы: 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; - - операция ”+” для типа РЯД

  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 ОБНОВЛЕНИЕ_ПО_УМОЛЧАНИЮ;

Примечание. Ограничения на параметр формальной подпрограммы те же, что у со­ответствующего параметра в спецификации сопоставленной фактической подпрограм­мы (а не те, которые вводятся соответствующим обозначением типа в спецификации формальной подпрограммы). Это же относится и к результату функции. Во избежание путаницы рекомендуется везде, где можно, в описании формальной подпрограммы использовать имя базового типа, а не имя подтипа. Если, однако, базовый тип анони­мен, то рекомендуется использовать имя подтипа, определенное в описании типа.

Тип, заданный для формального параметра формальной подпрограммы настрой­ки, может быть любым видимым типом, включая формальный тип настройки из того же раздела формальных параметров настройки.

  1. Настраиваемое тело

Тело настраиваемой подпрограммы или настраиваемого пакета (настра­иваемое тело) является шаблоном для тел соответствующих подпрограмм или пакетов, получаемых конкретизацией настройки. Синтаксис настраивае­мого тела идентичен обычному телу.

Для каждого описания настраиваемой подпрограммы должно быть со­ответствующее тело.

Предвыполнение настраиваемого тела не имеет другого эффекта, кроме установления того, что тело, начиная с этого момента, может быть использо­вано в качестве шаблона для получения соответствующих экземпляров.

Пример настраиваемого тела процедуры:

procedure ЗАМЕНА (А, В: in out ЭЛЕМ) is - - см. пример в 12.1

  1. ЭЛЕМ; - - формальный тип настройки

begin

  1. = А;

  2. = В;

  3. = Т;

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 + СМЕЩЕНИЕ));

  1. - формальная функция СУММА

end loop;

return РЕЗУЛЬТАТ;

end;

function СИГМА (А: ВЕКТОР) return ЭЛЕМЕНТ is

ИТОГ: ЭЛЕМЕНТ: = A (A'FIRST); - - формальный тип ЭЛЕМЕНТ begin

for К in A'FIRST + 1. .A'LAST loop

ИТОГ: = СУММА (ИТОГ, А (К)); - - формальная функция СУММА end loop;

return ИТОГ;

end;

end;

  1. Конкретизация настройки

Экземпляр настраиваемого модуля описывается конкретизацией на­стройки.

конкретизация—настройки : : =

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.

Экземпляр — это копия настраиваемого модуля без его раздела фор­мальных параметров настройки; таким образом, экземпляр настраиваемо­го пакета — пакет, настраиваемой процедуры — процедура, настраиваемой функции — функция. Для каждого вхождения обозначающего данное поня­тие имени в настраиваемый модуль следующий список определяет, какое понятие соответствует этому имени в экземпляре.

  1. Имя обозначает этот настраиваемый модуль; соответствующее вхож­дение обозначает экземпляр.

  2. Имя обозначает формальный объект настройки вида in; соответству­ющее в экземпляре имя обозначает константу, значение которой — копия значения сопоставленного фактического параметра настройки.

  3. Имя обозначает формальный объект настройки вида in out; соответ­ствующее в экземпляре имя обозначает переменную, указанную сопостав­ленным фактическим параметром настройки.

  4. Имя обозначает формальный тип настройки; соответствующее в эк­земпляре имя обозначает подтип, указанный сопоставленным фактическим параметром настройки (фактическим подтипом).

  5. Имя обозначает дискриминант формального типа настройки; соот­ветствующее в экземпляре имя обозначает соответствующий дискриминант (он должен быть один) фактического типа, сопоставленного формальному типу настройки.

  6. Имя обозначает формальную подпрограмму настройки; соответст­вующее в экземпляре имя обозначает подпрограмму, литерал перечисления или вход, указанный сопоставленным фактическим параметром настройки (фактической подпрограммой).

  7. Имя обозначает формальный параметр формальной подпрограммы настройки; соответствующее в экземпляре имя обозначает соответствую­щий формальный параметр фактической подпрограммы, соответствующей формальной подпрограмме.

  8. Имя обозначает локальное понятие, описанное в настраиваемом мо­дуле; соответствующее в экземпляре имя обозначает понятие, описанное соответствующим локальным описанием в экземпляре.

  9. Имя обозначает глобальное понятие, описанное вне настраиваемого модуля; соответствующее в экземпляре имя обозначает это же глобальное понятие.