Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

6.4 Вызовы подпрограмм

Вызов подпрограммы — это либо оператор procedure_call_statement, либо оператор function_call; он вызывает выполнение subprogram_body. Вызов задаёт соответствие фактических параметров, если таковые имеются, с формальными параметрами подпрограммы.

Синтаксис

procedure_call_statement ::=
procedure_имя;
| procedure_префикс actual_parameter_part;
function_call ::=
function_имя
| function_префикс actual_parameter_part
actual_parameter_part ::=
(parameter_association {, parameter_association})
parameter_association ::=
[formal_parameter_имя_селектора =>] explicit_actual_parameter
explicit_actual_parameter ::= выражение | variable_имя
Сопоставление параметров parameter_association является именованным или позиционным в зависимости от того, указано ли formal_parameter_имя_селектора. Для сопоставлений параметров parameter_association в рамках одного actual_parameter_part или iterator_actual_parameter_part любые позиционные соответствия должны предшествовать любым именованным. Именованные соответствия не допускаются, если префикс префикс в вызове подпрограммы является attribute_reference.

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

Имя имя или префикс префикс, указанный в procedure_call_statement, должен соответствовать вызываемому объекту, являющемуся процедурой или переименованному входу (рассматриваемому как процедура). Имя имя или префикс префикс, указанный в function_call, должен соответствовать вызываемому объекту, являющемуся функцией. Имя имя или префикс префикс не должен соответствовать абстрактной подпрограмме, если она также не является диспетчерской подпрограммой. Если имеется actual_parameter_part, префикс префикс может быть implicit_dereference значения доступа к подпрограмме.
Вызов подпрограммы должен содержать не более одного соответствия для каждого формального параметра. Каждый формальный параметр без соответствия должен иметь default_expression (в профиле представления, обозначаемого именем имя или префикс). Это правило является правилом перегрузки (см. 8.6).

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

Если имя имя или префикс префикс вызова подпрограммы обозначает префиксное представление (см. 4.1.3), вызов подпрограммы эквивалентен вызову базовой подпрограммы, при этом первый фактический параметр предоставляется префиксом префиксного представления (или атрибутом Access этого префикса, если первый формальный параметр является параметром доступа), а оставшиеся фактические параметры — частью actual_parameter_part, если таковые имеются.

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

Для выполнения вызова подпрограммы вычисляется имя имя или префикс префикс вызова, и вычисляется каждое сопоставление параметров parameter_association (см. 6.4.1). Если используется default_expression, для этого правила предполагается неявное сопоставление параметров. Эти вычисления выполняются в произвольном порядке. Затем выполняется subprogram_body или выполняется вызов входа или защищённой подпрограммы (см. 3.9.2). Наконец, если подпрограмма завершается нормально, после её завершения происходит необходимое присвоение формальных параметров фактическим параметрам (см. 6.4.1).
Исключение Program_Error поднимается в момент function_call, если функция завершается нормально без выполнения оператора return.
Вызов функции function_call обозначает константу, как определено в 6.5; номинальный тип константы задаётся номинальным типом результата функции.

Примеры

Примеры вызовов процедур:
Traverse_Tree; -- см. 6.1
Print_Header(128, Title, True); -- см. 6.1
Switch(From => X, To => Next); -- см. 6.1
Print_Header(128, Header => Title, Center => True); -- см. 6.1
Print_Header(Header => Title, Center => True, Pages => 128); -- см. 6.1
Примеры вызовов функций:
Dot_Product(U, V) -- см. 6.1 и 6.3
Clock -- см. 9.6
F.all -- предполагая, что F имеет тип доступа к подпрограмме — см. 3.10
Примеры процедур с выражениями по умолчанию:
procedure Activate(Process : in Process_Name;
After : in Process_Name := No_Process;
Wait : in Duration := 0.0;
Prior : in Boolean := False);
procedure Pair(Left, Right : in Person_Name := new Person(M)); -- см. 3.10.1
Примеры их вызовов:
Activate(X);
Activate(X, After => Y);
Activate(X, Wait => 60.0, Prior => True);
Activate(X, Y, 10.0, False);
Pair;
Pair(Left => new Person(F), Right => new Person(M));
ПРИМЕЧАНИЕ Если выражение по умолчанию используется для двух или более параметров в нескольких parameter_specification, выражение по умолчанию вычисляется один раз для каждого пропущенного параметра. Следовательно, в приведённых выше примерах два вызова Pair эквивалентны.

Примеры

Примеры перегруженных подпрограмм:
procedure Put(X : in Integer);
procedure Put(X : in String);
procedure Set(Tint : in Color);
procedure Set(Signal : in Light);
Примеры их вызовов:
Put(28);
Put("no possible ambiguity here");
Set(Tint => Red);
Set(Signal => Red);
Set(Color'(Red));
-- Set(Red) было бы неоднозначным, поскольку Red может
-- обозначать значение либо типа Color, либо типа Light


Spec-Zone.ru

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