Справочник по Ada 2012
6.4 Вызовы подпрограмм
Вызов подпрограммы — это либо оператор вызова процедуры procedure_call_statement, либо вызов функции function_call; он вызывает выполнение тела подпрограммы subprogram_body. Вызов указывает на ассоциацию фактических параметров, если таковые имеются, с формальными параметрами подпрограммы.
Синтаксис
Ассоциация параметров parameter_association является именованной или позиционной в зависимости от того, указано ли имя_формального_параметраselector_name. Любые позиционные ассоциации должны предшествовать именованным ассоциациям. Именованные ассоциации не допускаются, если префикс prefix в вызове подпрограммы является ссылкой на атрибут attribute_reference.
Правила разрешения имен
Имя name или префикс prefix в операторе вызова процедуры procedure_call_statement должны ссылаться на вызываемый элемент, являющийся процедурой или переименованным входом (рассматриваемым как процедура). Имя name или префикс prefix в вызове функции function_call должны ссылаться на вызываемый элемент, являющийся функцией. Имя или префикс не должны ссылаться на абстрактную подпрограмму, если она не является также диспетчеризуемой подпрограммой. При наличии actual_parameter_part, префикс может быть неявной ссылкой на значение доступа к подпрограмме.
Вызов подпрограммы должен содержать не более одной ассоциации для каждого формального параметра. Каждый формальный параметр без ассоциации должен иметь выражение_по_умолчанию (в профиле отображаемой name или prefix). Это правило является правилом перегрузки (см. 8.6).
Динамическая семантика
При выполнении вызова подпрограммы имя или префикс вызова оцениваются, и каждая ассоциация параметра parameter_association оценивается (см. 6.4.1). Если используется выражение по умолчанию, для этого правила предполагается неявная ассоциация параметра parameter_association. Эти оценки выполняются в произвольном порядке. Затем выполняется тело подпрограммы subprogram_body, или выполняется вызов входа или защищенной подпрограммы (см. 3.9.2). Наконец, если подпрограмма завершается нормально, то после ее завершения происходит необходимое присвоение формальных параметров фактическим параметрам (см. 6.4.1).
Если имя или префикс вызова подпрограммы обозначает префиксное представление (см. 4.1.3), вызов подпрограммы эквивалентен вызову базовой подпрограммы, причём первый фактический параметр предоставляется префиксом префиксного представления (или атрибутом доступа этого префикса, если первый формальный параметр является параметром доступа), а оставшиеся фактические параметры задаются частью фактических параметров actual_parameter_part, если таковые имеются.
Исключение Program_Error возникает в момент вызова функции function_call, если функция завершается нормально без выполнения оператора return.
Вызов функции function_call обозначает константу, как определено в 6.5; номинальный тип константы задаётся номинальным типом результата функции.
Примеры
Примеры вызовов процедур:
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
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
Clock -- см. 9.6
F.all -- предполагая, что F имеет тип доступа к подпрограмме — см. 3.10
Примеры процедур с выражениями по умолчанию:
процедура Activate(Process : вход Process_Name;
After : вход Process_Name := No_Process;
Wait : вход Duration := 0.0;
Prior : вход Boolean := False);
After : вход Process_Name := No_Process;
Wait : вход Duration := 0.0;
Prior : вход Boolean := False);
процедура Pair(Left, Right : вход Person_Name := новый Person(M)); -- см. 3.10.1
Примеры их вызовов:
Activate(X);
Activate(X, After => Y);
Activate(X, Wait => 60.0, Prior => True);
Activate(X, Y, 10.0, False);
Activate(X, After => Y);
Activate(X, Wait => 60.0, Prior => True);
Activate(X, Y, 10.0, False);
Pair;
Pair(Left => новый Person(F), Right => новый Person(M));
Pair(Left => новый Person(F), Right => новый Person(M));
ПРИМЕЧАНИЯ
9 Если для двух или более параметров в множественном определении параметров parameter_specification используется выражение по умолчанию, выражение по умолчанию вычисляется один раз для каждого пропущенного параметра. Следовательно, в приведенных выше примерах два вызова Pair эквивалентны.
Примеры
Примеры перегруженных подпрограмм:
процедура Put(X : вход Integer);
процедура Put(X : вход String);
процедура Put(X : вход String);
процедура Set(Tint : вход Color);
процедура Set(Signal : вход Light);
процедура Set(Signal : вход Light);
Примеры их вызовов:
Put(28);
Put("no possible ambiguity here");
Put("no possible ambiguity here");
Set(Tint => Red);
Set(Signal => Red);
Set(Color'(Red));
Set(Signal => Red);
Set(Color'(Red));
-- Set(Red) было бы неоднозначным, так как Red может
-- обозначать значение типа Color или типа Light
-- обозначать значение типа Color или типа Light