Справочник по Ada (Ada 2022)
6.1 Объявления подпрограмм
A subprogram_declaration объявляет процедуру или функцию.
Синтаксис
Этот абзац был удалён.
Опциональное parent_unit_name разрешено только для модулей библиотек (см. 10.1.1).
Последовательность символов в operator_symbol должна образовывать ключевое слово, разделитель или составной разделитель, соответствующий оператору, принадлежащему одному из шести категорий операторов, определённых в 4.5.
parameter_and_result_profile ::=
[formal_part] return [null_exclusion] subtype_mark [:= default_expression]
| [formal_part] return access_definition
[formal_part] return [null_exclusion] subtype_mark [:= default_expression]
| [formal_part] return access_definition
parameter_specification ::=
defining_identifier_list : [aliased] mode [null_exclusion] subtype_mark [:= default_expression]
[aspect_specification]
| defining_identifier_list : access_definition [:= default_expression]
[aspect_specification]
defining_identifier_list : [aliased] mode [null_exclusion] subtype_mark [:= default_expression]
[aspect_specification]
| defining_identifier_list : access_definition [:= default_expression]
[aspect_specification]
mode ::= [in] | in out | out
Правила разрешения имён
Формальный параметр — это объект, непосредственно видимый внутри subprogram_body, который представляет фактический параметр, переданный подпрограмме в вызове; он объявляется с помощью parameter_specification. Для формального параметра ожидаемый тип его default_expression, если таковой имеется, — это тип формального параметра.
Правила корректности
Режим параметра формального параметра передаёт направление передачи информации с фактическим параметром: in, in out или out. Режим in является по умолчанию и является режимом параметра, определённого с помощью access_definition.
Значение по умолчанию default_expression разрешено только в parameter_specification для формального параметра с режимом in.
subprogram_declaration или generic_subprogram_declaration требует завершения, если для объявления установлен аспект Import (см. B.1); завершением должна быть подпрограмма или renaming_declaration (см. 8.5). Завершение не разрешено для abstract_subprogram_declaration (см. 3.9.3), null_procedure_declaration (см. 6.7) или expression_function_declaration (см. 6.8).
Имя, обозначающее формальный параметр, не допускается в formal_part, в котором он объявлен, ни в formal_part соответствующей подпрограммы, ни в accept_statement.
Статическая семантика
Профиль (вид) вызываемого сущности — это parameter_profile или parameter_and_result_profile; он воплощает информацию об интерфейсе этой сущности — например, профиль содержит информацию о параметрах, передаваемых вызываемой сущности. Все вызываемые сущности имеют профиль — литералы перечислений, другие подпрограммы и входы. Тип доступа к подпрограмме имеет назначенный профиль. С профилем связан соглашение о вызовах. subprogram_declaration объявляет процедуру или функцию, как указано начальным ключевым словом, с именем и профилем, заданными в его спецификации.
Номинальный подтип формального параметра — это подтип, определяемый опциональным null_exclusion и subtype_mark, или определяется с помощью access_definition, в parameter_specification. Номинальный подтип результата функции — это подтип, определяемый опциональным null_exclusion и subtype_mark, или определяется с помощью access_definition, в parameter_and_result_profile.
Явно ссылочный параметр — формальный параметр, спецификация которого содержит ключевое слово aliased.
Параметр доступа — это формальный параметр в, заданный access_definition. Тип результата доступа — это тип результата функции, заданный access_definition. Параметр или тип результата доступа имеют анонимный тип доступа (см. 3.10). Параметры доступа типа доступа к объекту позволяют управлять вызовами диспетчеризации с помощью значений доступа. Параметры доступа типа доступа к подпрограмме позволяют вызывать подпрограммы, переданные в качестве параметров, независимо от их уровня доступности.
Подтипы профиля:
- Для любых параметров, не являющихся параметрами доступа, номинальный подтип параметра.
- Для любых параметров доступа типа доступа к объекту, обозначенный подтип типа параметра.
- Для любых параметров доступа типа доступа к подпрограмме, подтипы обозначенного профиля типа параметра.
- Для любого результата, не являющегося параметром доступа, номинальный подтип результата функции.
- Для любого типа результата доступа типа доступа к объекту, обозначенный подтип типа результата.
- Для любого типа результата доступа типа доступа к подпрограмме, подтипы обозначенного профиля типа результата.
Типы профиля — это типы этих подтипов.
Подпрограмма, объявленная с помощью abstract_subprogram_declaration, является абстрактной; подпрограмма, объявленная с помощью subprogram_declaration, таковой не является. См. 3.9.3, «Абстрактные типы и подпрограммы». Аналогично, процедура, объявленная с помощью null_procedure_declaration, является процедурой null; процедура, объявленная с помощью subprogram_declaration, таковой не является. См. 6.7, «Процедуры null». Наконец, функция, объявленная с помощью expression_function_declaration, является выражением функции; функция, объявленная с помощью subprogram_declaration, таковой не является. См. 6.8, «Функции-выражения».
Используется overriding_indicator для указания на то, предполагается ли переопределение. См. 8.3.1, «Указатели переопределения».
Динамическая семантика
Выполнение subprogram_declaration не оказывает никакого влияния.
ПРИМЕЧАНИЕ 1 parameter_specification с несколькими идентификаторами эквивалентен последовательности отдельных parameter_specifications, как объяснено в 3.3.
ПРИМЕЧАНИЕ 2 Абстрактные подпрограммы не имеют тел и не могут использоваться в вызове без диспетчеризации (см. 3.9.3, «Абстрактные типы и подпрограммы»).
ПРИМЕЧАНИЕ 3 Вычисление default_expressions вызывается определёнными вызовами, как описано в 6.4.1. Они не вычисляются во время выполнения объявления подпрограммы.
ПРИМЕЧАНИЕ 4 Подпрограммы могут вызываться рекурсивно и могут вызываться одновременно из нескольких задач.
Примеры
Примеры объявлений подпрограмм:
procedure Traverse_Tree;
procedure Increment(X : in out Integer);
procedure Right_Indent(Margin : out Line_Size); -- см. 3.5.4
procedure Switch(From, To : in out Link); -- см. 3.10.1
procedure Increment(X : in out Integer);
procedure Right_Indent(Margin : out Line_Size); -- см. 3.5.4
procedure Switch(From, To : in out Link); -- см. 3.10.1
function Random return Probability; -- см. 3.5.7
function Min_Cell(X : Link) return Cell; -- см. 3.10.1
function Next_Frame(K : Positive) return Frame; -- см. 3.10
function Dot_Product(Left, Right : Vector) return Real; -- см. 3.6
function Find(B : aliased in out Barrel; Key : String) return Real;
-- см. 4.1.5
function Next_Frame(K : Positive) return Frame; -- см. 3.10
function Dot_Product(Left, Right : Vector) return Real; -- см. 3.6
function Find(B : aliased in out Barrel; Key : String) return Real;
-- см. 4.1.5
function "*"(Left, Right : Matrix) return Matrix; -- см. 3.6
Примеры параметров in с выражениями по умолчанию:
procedure Print_Header(Pages : in Natural;
Header : in Line := (1 .. Line'Last => ' '); -- см. 3.6
Center : in Boolean := True);
Header : in Line := (1 .. Line'Last => ' '); -- см. 3.6
Center : in Boolean := True);