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

12.6 Формальные подпрограммы

Формальные подпрограммы могут использоваться для передачи вызываемых сущностей в обобщённый блок.

Синтаксис

formal_subprogram_declaration ::= formal_concrete_subprogram_declaration
| formal_abstract_subprogram_declaration
formal_concrete_subprogram_declaration ::=
with subprogram_specification [is subprogram_default];
formal_abstract_subprogram_declaration ::=
with subprogram_specification is abstract [subprogram_default];
subprogram_default ::= default_name | <> | null
default_name ::= name
Значение subprogram_default по умолчанию null не должно быть указано для формальной функции или для formal_abstract_subprogram_declaration.

Правила разрешения имён

Ожидаемый профиль для default_name, если таковой имеется, — это профиль формальной подпрограммы.
Для формальной подпрограммы обобщённого блока ожидаемый профиль фактического значения — это профиль формальной подпрограммы.

Правила допустимости

Профили формального и любого именованного значения по умолчанию должны быть согласованы по режиму.
Профили формального и фактического значений должны быть согласованы по режиму.
Для параметра или типа результата formal_subprogram_declaration, имеющего явное null_exclusion:
  • если фактическое значение, соответствующее formal_subprogram_declaration, обозначает обобщённый формальный объект другого обобщённого блока G, и экземпляр, содержащий фактическое значение, встречается в теле обобщённого блока G или в теле обобщённого блока, объявленного в области объявления обобщённого блока G, то соответствующий параметр или тип результата формальной подпрограммы G должен иметь null_exclusion;
  • в противном случае, тип соответствующего параметра или типа результата фактического значения, соответствующего formal_subprogram_declaration, должен исключать null. В дополнение к местам, где обычно применяются правила допустимости (см. 12.3), это правило применяется также в закрытой части экземпляра обобщённого блока.
Если формальный параметр formal_abstract_subprogram_declaration имеет тип T или анонимный тип доступа, обозначающий конкретный тип T, то T называется управляющим типом formal_abstract_subprogram_declaration. Аналогично, если результат formal_abstract_subprogram_declaration для функции имеет конкретный тип T или анонимный тип доступа, обозначающий конкретный тип T, то T называется управляющим типом formal_abstract_subprogram_declaration. formal_abstract_subprogram_declaration должен иметь ровно один управляющий тип.
Фактическая подпрограмма для formal_abstract_subprogram_declaration должна быть операцией диспетчеризации управляющего типа или фактического типа, соответствующего управляющему типу.

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

formal_subprogram_declaration объявляет формальную подпрограмму обобщённого блока. Типы формальных параметров и результата формальной подпрограммы определяются subtype_mark в formal_subprogram_declaration; однако, независимо от конкретных типов, обозначаемых subtype_marks, номинальные типы формальных параметров и результата (если таковой имеется) определяются как нестатические и не ограниченные, если они имеют тип массива (в вызове формальной подпрограммы не предоставляется соответствующее ограничение индекса).
В экземпляре formal_subprogram_declaration объявляет вид фактического значения. Профиль этого вида берёт свои типы и соглашение вызова из исходного профиля фактической сущности, а имена формальных параметров и значения по умолчанию — из профиля, указанного в formal_subprogram_declaration. Вид является функцией или процедурой, но не входом.
Если обобщённый блок имеет subprogram_default, заданный ящиком, а соответствующий фактический параметр опущен, то это эквивалентно явным фактическим параметрам, которые идентичны определяющему имени формального значения.
Если обобщённый блок имеет subprogram_default, заданный ключевым словом null, а соответствующий фактический параметр опущен, то это эквивалентно явным фактическим параметрам, которые являются процедурой null с профилем, указанным в formal_subprogram_declaration.
Подпрограмма, объявленная formal_abstract_subprogram_declaration с управляющим типом T, является операцией диспетчеризации типа T.
ПРИМЕЧАНИЯ
13 Правила сопоставления формальных подпрограмм предъявляют требования, аналогичные тем, которые применяются к subprogram_renaming_declarations (см. 8.5.4). В частности, имя параметра формальной подпрограммы не обязательно должно совпадать с именем соответствующего параметра фактической подпрограммы; аналогично, для этих параметров default_expressions не обязательно должны совпадать.
14 Ограничения, применяемые к параметру формальной подпрограммы, — это ограничения соответствующего формального параметра сопоставляемой фактической подпрограммы (а не те, которые подразумеваются соответствующим subtype_mark в _specification формальной подпрограммы). Аналогичное замечание относится к результату функции. Поэтому, чтобы избежать путаницы, рекомендуется использовать имя первого подтипа в любом объявлении формальной подпрограммы.
15 Подтип, указанный для формального параметра обобщённой формальной подпрограммы, может быть любым видимым подтипом, включая обобщённый формальный подтип того же generic_formal_part.
16 Формальная подпрограмма сопоставляется с атрибутом типа, если атрибут является функцией с соответствующим описанием. Элемент перечисления заданного типа сопоставляется с безаргументной формальной функцией, тип результата которой — заданный тип.
17 default_name обозначает сущность, которая видна или непосредственно видна в месте generic_declaration; ящик, используемый в качестве значения по умолчанию, эквивалентен имени, обозначающему сущность, которая непосредственно видна в месте _instantiation.
18 Фактическая подпрограмма не может быть абстрактной, если формальная подпрограмма не является formal_abstract_subprogram_declaration (см. 3.9.3).
19 Подпрограмма, объявленная formal_abstract_subprogram_declaration, является абстрактной подпрограммой. Все вызовы подпрограммы, объявленной formal_abstract_subprogram_declaration, должны быть вызовами диспетчеризации. См. 3.9.3.
20 Процедура null в качестве значения по умолчанию подпрограммы имеет соглашение Intrinsic (см. 6.3.1).

Примеры

Примеры формальных подпрограмм обобщённого блока:
END_OF_DOCUMENT_MARKER
с функцией "+"(X, Y : Элемент) возвращает Элемент есть <>;
с функцией Image(X : Перечисление) возвращает Строка есть Enum'Image;
с процедурой Update есть Default_Update;
с процедурой Pre_Action(X : входной Элемент) есть null; -- по умолчанию, без действий
с процедурой Write(S : не null доступ Root_Stream_Type'Класс;
Desc : Описание)
есть абстрактная Descriptor'Write; -- см. 13.13.2
-- Операция диспетчеризации на Описание по умолчанию
-- учитывая объявление общей процедуры
общий
с процедурой Action (X : входной Элемент);
процедура Iterate(Seq : входной Последовательность_элементов);
-- и процедура
процедура Put_Item(X : входной Элемент);
-- следующее создание возможно
процедура Put_List есть новый Iterate(Action => Put_Item);


Spec-Zone.ru

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