Справочник по Ada 95
6.1 Объявления подпрограмм
Объявление subprogram_declaration объявляет процедуру или функцию.
Синтаксис
subprogram_declaration ::= subprogram_specification;
abstract_subprogram_declaration ::= subprogram_specification is abstract;
subprogram_specification ::=
procedure defining_program_unit_name parameter_profile
| function defining_designator parameter_and_result_profile
procedure defining_program_unit_name parameter_profile
| function defining_designator parameter_and_result_profile
designator ::= [parent_unit_name . ]identifier | operator_symbol
defining_designator ::= defining_program_unit_name | defining_operator_symbol
defining_program_unit_name ::= [parent_unit_name . ]defining_identifier
Необязательное parent_unit_name разрешено только для библиотек (см. 10.1.1).
operator_symbol ::= string_literal
Последовательность символов в operator_symbol должна соответствовать оператору, принадлежащему одному из шести классов операторов, определенных в разделе 4.5 (пробелы не допускаются, регистр букв не имеет значения).
defining_operator_symbol ::= operator_symbol
parameter_profile ::= [formal_part]
parameter_and_result_profile ::= [formal_part] return subtype_mark
formal_part ::=
(parameter_specification {; parameter_specification})
(parameter_specification {; parameter_specification})
parameter_specification ::=
defining_identifier_list : mode subtype_mark [:= default_expression]
| defining_identifier_list : access_definition [:= default_expression]
defining_identifier_list : mode 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) или псевдоним Import (см. B.1). Завершение не допускается для abstract_subprogram_declaration.
Имя, обозначающее формальный параметр, не разрешено в formal_part, в котором он объявлен, а также в formal_part соответствующего тела или accept_statement.
Статическая семантика
Профиль (вид) вызываемого сущности — это либо parameter_profile, либо parameter_and_result_profile; он содержит информацию об интерфейсе этой сущности — например, профиль включает информацию о параметрах, передаваемых вызываемой сущности. Все вызываемые сущности имеют профиль — литералы перечислений, другие подпрограммы и записи. Тип доступа к подпрограмме имеет выделенный профиль. С профилем связан соглашение о вызовах. subprogram_declaration объявляет процедуру или функцию, как указано начальным зарезервированным словом, с именем и профилем, заданным в его спецификации.
Номинальный подтип формального параметра — это подтип, обозначаемый subtype_mark или определённый access_definition в parameter_specification.
Параметр доступа — это формальный параметр in, определённый с помощью access_definition. Параметр доступа имеет тип анонимного общего типа доступа к переменной (см. 3.10). Параметры доступа позволяют управлять вызовами с диспетчеризацией значениями доступа.
Подтипы профиля:
- Для любых параметров, не являющихся параметрами доступа, — номинальный подтип параметра.
- Для любых параметров доступа — подтип, определяемый параметром.
- Для любого результата — подтип результата.
Типы профиля — это типы этих подтипов.
Подпрограмма, объявленная с помощью abstract_subprogram_declaration, является абстрактной; подпрограмма, объявленная с помощью subprogram_declaration, — нет. См. 3.9.3, «Абстрактные типы и подпрограммы».
Динамическая семантика
Выполнение subprogram_declaration или abstract_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 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);