Справочник Ada 2005
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
| [formal_part] return access_definition
[formal_part] return [null_exclusion] subtype_mark
| [formal_part] return access_definition
parameter_specification ::=
defining_identifier_list : mode [null_exclusion] subtype_mark [:= default_expression]
| defining_identifier_list : access_definition [:= default_expression]
defining_identifier_list : mode [null_exclusion] subtype_mark [:= default_expression]
| defining_identifier_list : access_definition [:= default_expression]
mode ::= [in] | in out | out
Правила разрешения имён
Формальный параметр — это объект, непосредственно видимый внутри subprogram_body, представляющий фактический параметр, переданный подпрограмме в вызове; он объявляется parameter_specification. Для формального параметра ожидаемый тип его default_expression, если таковой имеется, соответствует типу формального параметра.
Правила легитимности
Режим параметра формального параметра передаёт направление передачи информации с фактическим параметром: in, in out или out. Режим in является по умолчанию и является режимом параметра, определённого access_definition. Формальные параметры функции, если таковые имеются, должны иметь режим in.
Значение по умолчанию default_expression разрешено только в parameter_specification для формального параметра режима in.
Объявление подпрограммы subprogram_declaration или generic_subprogram_declaration требует завершения: тело, renaming_declaration (см. 8.5) или pragma Import (см. B.1). Завершение не разрешается для abstract_subprogram_declaration (см. 3.9.3) или null_procedure_declaration (см. 6.7).
Имя name, обозначающее формальный параметр, не разрешено внутри 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.
Параметр доступа — это формальный параметр in, определённый access_definition. Тип результата доступа — тип результата функции, определённый access_definition. Параметр доступа или тип результата доступа относится к анонимному типу доступа (см. 3.10). Параметры доступа типа доступа к объекту позволяют управлять вызовами с диспетчеризацией, используя значения доступа. Параметры доступа типа доступа к подпрограмме позволяют вызывать подпрограммы, передаваемые в качестве параметров, независимо от уровня их доступности.
Подтипы профиля:
- Для любых параметров, не являющихся параметрами доступа, номинальный подтип параметра.
- Для любых параметров доступа типа доступа к объекту — подтип, определяемый типом параметра.
- Для любых параметров доступа типа доступа к подпрограмме — подтипы профиля типа параметра.
- Для любого результата без доступа, номинальный подтип результата функции.
- Для любого типа результата доступа к типу объекта, назначенный подтип типа результата.
- Для любого типа результата доступа к типу подпрограммы, подтипы профиля типа результата.
Типы профиля — это типы этих подтипов.
Подпрограмма, объявленная с помощью abstract_subprogram_declaration, абстрактная; подпрограмма, объявленная с помощью subprogram_declaration, нет. См. 3.9.3, «Абстрактные типы и подпрограммы». Аналогично, процедура, определённая с помощью null_procedure_declaration, является нулевой процедурой; процедура, объявленная с помощью subprogram_declaration, нет. См. 6.7, «Нулевые процедуры».
Индикатор overriding_indicator используется для указания того, предполагается ли переопределение. См. 8.3.1, «Индикаторы переопределения».
Динамическая семантика
Выполнение subprogram_declaration не имеет эффекта.
ПРИМЕЧАНИЯ
1 Параметр parameter_specification с несколькими идентификаторами эквивалентен последовательности одиночных parameter_specifications, как объяснено в 3.3.
2 Абстрактные подпрограммы не имеют тела и не могут быть использованы в вызове без диспетчеризации (см. 3.9.3, «Абстрактные типы и подпрограммы»).
3 Вычисление default_expression вызывается определёнными вызовами, как описано в 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 Next_Frame(K : Positive) return Frame; -- см. 3.10
function Dot_Product(Left, Right : Vector) return Real; -- см. 3.6
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);