Spec-Zone.ru › Ada 2012
Справочник Ada 2012

6.1 Объявления подпрограмм

A subprogram_declaration объявляет процедуру или функцию.

Синтаксис

subprogram_declaration ::=
[overriding_indicator]
subprogram_specification
[aspect_specification];
Этот абзац был удален.
subprogram_specification ::=
procedure_specification
| function_specification
procedure_specification ::= procedure defining_program_unit_name parameter_profile
function_specification ::= 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 [null_exclusion] subtype_mark
| [formal_part] return access_definition
formal_part ::=
(parameter_specification {; parameter_specification})
parameter_specification ::=
defining_identifier_list : [aliased] 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.
Выражение по умолчанию default_expression разрешено только в parameter_specification для формального параметра с режимом in.
Объявление подпрограммы subprogram_declaration или generic_subprogram_declaration требует завершения, если аспект Import (см. B.1) равен True для объявления; завершение должно быть телом или renaming_declaration (см. 8.5). Завершение не разрешено для abstract_subprogram_declaration (см. 3.9.3), null_procedure_declaration (см. 6.7) или expression_function_declaration (см. 6.8).
Имя 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.
Явно алиасированный параметр — это формальный параметр, чья parameter_specification включает ключевое слово aliased.
Параметр доступа — это формальный параметр in, заданный с помощью access_definition. Тип доступа к результату — это тип результата функции, заданный с помощью access_definition. Параметр или тип результата доступа — это анонимный тип доступа (см. 3.10). Параметры доступа типа доступа к объекту позволяют контролировать вызовы с разнесением по значениям доступа. Параметры доступа типа доступа к подпрограмме позволяют вызывать подпрограммы, переданные как параметры, независимо от их уровня доступности.
Подтипы профиля:
END_OF_DOCUMENT_MARKER
  • Для всех параметров без доступа, номинальный подтип параметра.
  • Для всех параметров доступа типа доступа к объекту, обозначенный подтип типа параметра.
  • Для всех параметров доступа типа доступа к подпрограмме, подтипы обозначенного профиля типа параметра.
  • Для всех результатов без доступа, номинальный подтип результата функции.
  • Для всех типов результатов доступа типа доступа к объекту, обозначенный подтип типа результата.
  • Для всех типов результатов доступа типа доступа к подпрограмме, подтипы обозначенного профиля типа результата.
Типы профиля — это типы этих подтипов.
Подпрограмма, объявленная с помощью abstract_subprogram_declaration, является абстрактной; подпрограмма, объявленная с помощью subprogram_declaration, не является. См. 3.9.3, «Абстрактные типы и подпрограммы». Аналогично, процедура, объявленная с помощью null_procedure_declaration, является процедурой без выполнения; процедура, объявленная с помощью subprogram_declaration, не является. См. 6.7, «Процедуры без выполнения». Наконец, функция, объявленная с помощью expression_function_declaration, является функцией-выражением; функция, объявленная с помощью subprogram_declaration, не является. См. 6.8, «Функции-выражения».
Индикатор overriding_indicator используется для указания того, предполагается ли переопределение. См. 8.3.1, «Индикаторы переопределения».

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

Выполнение subprogram_declaration не имеет эффекта.
ПРИМЕЧАНИЯ
1 parameter_specification с несколькими идентификаторами эквивалентен последовательности отдельных parameter_specificationов, как объясняется в 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
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 "*"(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);


Spec-Zone.ru

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