Содержание
Настраиваемый модуль — это программный модуль, являющийся настраиваемой подпрограммой или настраиваемым пакетом, это также шаблон с параметрами или без них, по которому могут быть получены соответствующие (ненастраиваемые) подпрограммы или пакеты. Итоговые программные модули называются экземплярами исходного настраиваемого модуля.
Настраиваемый модуль задается описанием настройки, которое имеет раздел формальных параметров настройки, описывающий эти параметры. Конкретный экземпляр настраиваемого модуля получается в результате конкретизации настройки путем сопоставления формальным параметрам фактических. Экземпляр настраиваемой подпрограммы — это подпрограмма. Экземпляр настраиваемого пакета — пакет.
Как шаблоны настраиваемые модули не обладают свойствами, характерными для их ненастраиваемых аналогов. Например, настраиваемая подпрограмма может быть конкретизирована, но не может быть вызвана. В отличие от нее экземпляр настраиваемой подпрограммы может быть вызван, но не может использоваться для изготовления других экземпляров.
Ссылки: конкретизация настройки 12.3, настраиваемый пакет 12.1, настраиваемая подпрограмма 12.1, описание 3.1, описание настройки 12.1, пакет 7, подпрограмма 6, программный модуль 6, раздел формальных параметров настройки 12.1, фактический параметр настройки 12.3, формальный параметр настройки 12.1, экземпляр 12.3.
Описание настройки задает настраиваемый модуль — настраиваемую подпрограмму или настраиваемый пакет. Описание настройки включает раздел формальных параметров настройки, в котором описываются ее формальные параметры. Формальный параметр настройки может быть объектом; кроме того (в отличие от параметра подпрограммы), он может быть типом или подпрограммой.
описание-настройки ::= спецификация-настройки;спецификация-настройки ::= раздел-формальных-параметров-настройки спецификация-подпрограммы | раздел-формальных-параметров-настройки спецификация-пакетараздел-формальных-параметров-настройки :: = generic {описание-параметра-настройки}описание параметра-настройки ::= список-идентификаторов :[in [out]] обозначение-типа [:= выражение]; | type идентификатор is определение-настраиваемого-типа; | описание-личного-типа | with спецификация-подпрограммы [is имя]; [ with спецификация-подпрограммы [is <>];определение*-настраиваемого-типа ::= (<>) | range <> | digits <> | delta <> | определение-индексируемого-типа | определение-ссылочного-типа
Для ссылки на соответствующие формальные параметры настройки используются такие термины: формальный объект настройки (или, короче, формальный объект}, формальный тип настройки (или, короче, формальный тип) и формальная подпрограмма настройки (или, короче, формальная подпрограмма}.
В разделе формальных параметров настройки указание подтипа допустимо только в виде обозначения типа (т.е. такое указание подтипа не должно содержать явного ограничения). Обозначение настраиваемой подпрограммы должно быть задано идентификатором.
Имя программного модуля, являющегося настраиваемым модулем, вне его спецификации и тела обозначает этот настраиваемый модуль. В отличие от этого в зоне описания, связанной с настраиваемой подпрограммой, имя такого программного модуля обозначает подпрограмму, полученную при текущей конкретизации настраиваемого модуля. Аналогично в зоне описания, связанной с настраиваемым пакетом, имя программного модуля обозначает пакет, полученный при текущей конкретизации.
Предвыполнение описания настройки не имеет другого эффекта.
Примеры разделов формальных параметров:
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; -— формальная подпрограмма
Примеры описаний настройки с настраиваемыми подпрограммами:
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 (А. В : VECTOR) return VECTOR; function SIGMA (A : VECTOR) return ITEM; LENGTH_ERROR : exception;end;
Примечание. Внутри тела настраиваемой подпрограммы ее имя рассматривается как имя подпрограммы. Следовательно, это имя может быть совмещено, а также может появиться в рекурсивном вызове текущей конкретизации. По этой же причине его нельзя использовать после зарезервированного слова new в (рекурсивной) конкретизации настройки.
Выражение, которое находится в разделе формальных параметров настройки, — это выражение по умолчанию для формального параметра вида in, либо составная часть имени входа, заданного как имя по умолчанию для формальной подпрограммы, либо выражение по умолчанию для параметра формальной подпрограммы. В первых двух случаях значение этого выражения вычисляется только в тех конкретизациях, в которых используется соответствующее умолчание. В третьем случае значение выражения вычисляется только в вызовах формальных подпрограмм, использующих такое умолчание. (К любому имени, используемому в выражении по умолчанию, применяются обычные правила видимости: обозначенные этим именем понятия должны быть видимы в том месте, где стоит выражение.)
Ни формальные параметры настройки, ни их атрибуты в качестве частей статических выражений недопустимы (см. 4.9).
Ссылки: атрибут 4.1.4, выражение 4.4, зарезервированное слово 2.9, идентификатор 2.3, имя 4.1, конкретизация настройки 12.3, обозначение 6.1, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, описание 3.1, определение индексируемого типа 3.6, определение личного типа 7.4, определение ссылочного типа 3,8, параметр подпрограммы 6.2, подпрограмма 6, понятие 3.1, процедура 6.1, предвыполнение не имеет другого эффекта 3.1, совмещение 6.6, 8.7, спецификация пакета 7.1, спецификация подпрограммы 6.1, список идентификаторов 3.2, статическое выражение 4.9, тип 3.3, указание подтипа 3.3.2, функция 6.5, экземпляр 12.3.
12.1.1. ФОРМАЛЬНЫЕ ОБЪЕКТЫ НАСТРОЙКИ
Первая форма описания формального параметра настройки задает формальные объекты настройки. Тип формального объекта настройки — это базовый тип обозначения типа, данного в описании формального параметра настройки. Описание формального параметра настройки с несколькими идентификаторами эквивалентно последовательности единичных описаний, как поясняется в разд. 3.2.
Формальный объект настройки имеет вид in или in out. При отсутствии в описании формального параметра настройки явного указания вида подразумевается вид in. Если описание формального параметра настройки задано выражением, то оно является выражением по умолчанию для этого формального параметра. Выражение по умолчанию допустимо только для параметров вида in (указанного либо явно, либо неявно). Тип выражения по умолчанию должен быть таким же, как и у соответствующего формального параметра настройки.
Формальный объект настройки вида in — это константа, значение которой является копией значения сопоставленного ему фактического параметра конкретизации настройки, как описано в разд. 12.3. Тип формального объекта настройки вида in не должен быть лимитируемым типом; подтип 'такого формального объекта настройки — это подтип в обозначении типа, данного в описании параметра настройки.
Формальный объект настройки вида in out — это переменная, обозначающая объект, задаваемый в конкретизации настройки фактическим параметром настройки, как описано в разд. 12.3. Ограничения, применяемые к формальному объекту настройки, те же, что и для соответствующего фактического параметра.
Примечание. Ограничения, применяемые к формальному объекту настройки вида in out, те же, что и для соответствующего фактического параметра (а не те, которые связаны с обозначением типа из описания параметра настройки). Во избежание путаницы рекомендуется, когда это возможно, использовать в описании такого формального объекта имя базового типа. Если, однако, базовый тип анонимный, то рекомендуется использовать имя подтипа, определенного в описании базового типа.
Ссылки: анонимный тип 3.3.1, базовый тип 3.3, вид 6.1, идентификатор 2.3, имя 4.1, конкретизация настройки 12.3, лимитируемый тип 7.4.4, обозначение типа 3.3.2, объект 3.3, ограничение 3.3, описание 3.1, описание константы 3.2, описание параметра настройки 12.1, описание типа 3.2, переменная 3.2.1, подтип 3.2, присваивание 5.2, простое имя 4.1, сопоставление фактического параметра настройки 12.3, фактический параметр настройки 12.3, формальный объект настройки 12.1, формальный параметр настройки 12.1.
12.1.2. ФОРМАЛЬНЫЕ ТИПЫ НАСТРОЙКИ
Описание параметра настройки, включающее определение настраиваемого типа или описание личного типа, задает формальный тип настройки. Формальный тип настройки обозначает подтип, заданный соответствующим фактическим параметром в конкретизации настройки, как описано в п. г) разд. 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 ITEM is private;type BUFFER(LENGTH : NATURAL) is limited private;type ENUM is <>;type INT is range <>;type ANGLE is delta <>;type MASS is digits <>;type TABLE is array (ENUM) of ITEM;
Пример раздела формальных параметров настройки с описанием формального целого типа:
generic type RANK Is range <>; FIRST : RANK := RANK'PIRST; SECOND : RANK :== FIRST + 1; — операция «+» для типа RANK
Ссылки: генератор 4.8, дискретный диапазон 3.6, дискретный тип 3.6, индексируемая компонента 4.1.1, класс типа 3.3, конкретизация 12.3, лимитируемый личный тип 7.4.4, мультипликативная операция 4.5, 4.5.5, неравенство 4.5.2, обозначение типа 3.3.2, ограничение 3.3, операция 4.5, операция типа 3.3, описание 3.1, описание настраиваемого модуля 12.1, описание параметра настройки 12.1, определение индексируемого типа 3.6, определение личного типа 7.4, определение настраиваемого типа 12.1, отрезок 4.1.2, перечислимый тип 3.5.1, плавающий тип 3.5.7, присваивание 5.2, равенство 4.5.2, раздел дискриминантов 3.7.1, раздел формальных параметров настройки 12.1, родительский тип 3.4, скалярный тип 3.5, сопоставление фактических параметров настройки 12.3.2, 12.3.3, 12.3.4, 12.3.5, стандартный пакет 8.6 С, тело настраиваемого модуля 12.2, указание подтипа 3.3.2, универсальный фиксированный тип 3.5.9, фактический тип настройки 12.3, фиксированный тип 3.5.9, формальная подпрограмма настройки 12.1.3, формальный тип настройки 12.1, целый тип 3.5.4.
12.1.3. ФОРМАЛЬНЫЕ ПОДПРОГРАММЫ НАСТРОЙКИ
Описание параметра настройки, включающее спецификацию подпрограммы, описывает формальную подпрограмму настройки.
В описании формальной подпрограммы настройки могут встречаться две формы умолчания. В них после спецификации подпрограммы следует зарезервированное слово is и либо бокс, либо имя подпрограммы или входа. Правила сопоставления для таких умолчаний описаны в разд. 12.3,6.
Формальная подпрограмма настройки обозначает подпрограмму, литерал перечисления или вход, заданный соответствующим фактическим параметром настройки в конкретизации настройки, как описано в разд. 12.3.6.
Примеры формальных подпрограмм настройки:
with function INCREASE(X : INTEGER) return INTEGER;with function SUM(X, Y : ITEM) return ITEM;with function "+"(X, Y : ITEM) return ITEM is <>;with function IMAGE(X : ENUM) return STRING is ENUM'IMAGE;with procedure UPDATE is DEFAULT_UPDATE;
Примечание. Ограничения на параметр формальной подпрограммы те же, что у соответствующего параметра в спецификации сопоставленной фактической подпрограммы (а не те, которые вводятся соответствующим обозначением типа в спецификации формальной подпрограммы). Это же относится и к результату функции. Во избежании путаницы рекомендуется везде, где можно, в описании формальной подпрограммы использовать имя базового типа, а не имя подтипа. Если, однако, базовый тип — анонимный, то рекомендуется использовать имя подтипа, определенное в описании типа.
Тип, заданный для формального параметра формальной подпрограммы настройки, может быть любым видимым типом, включая формальный тип настройки из того же раздела формальных параметров настройки.
Ссылки: анонимный тип 3.2.1, базовый тип 3.3, бокс 12.1.2, зарезервированное слово 2.9, знак операции 6.1, идентификатор 2.3, конкретизация настройки 12.3, область действия 8.2, обозначение 6.1, обозначение типа 3,2.2, ограничение 3.3, описание параметров настройки 12.1, описание переименования 8.5, описание подпрограммы 6.2, подпрограмма 6, подтип 3.3.2, сопоставление фактических подпрограмм настройки 12.3.6, спецификация подпрограммы 6.1, тип 3.3, фактический параметр настройки 12.3, формальная подпрограмма настройки 12.1, формальная функция настройки 12.1.