Справочник Ada 2005
6.3 Тела подпрограмм
Тело subprogram_body определяет выполнение подпрограммы.
Синтаксис
subprogram_body ::=
[overriding_indicator]
subprogram_specification is
declarative_part
begin
handled_sequence_of_statements
end [designator];
[overriding_indicator]
subprogram_specification is
declarative_part
begin
handled_sequence_of_statements
end [designator];
Если в конце тела subprogram_body указан designator, он должен повторять defining_designator из спецификации подпрограммы subprogram_specification.
Правила корректности
В отличие от других тел, тело subprogram_body не обязательно должно быть завершением предыдущего объявления, в этом случае тело объявляет подпрограмму. Если тело является завершением, оно должно быть завершением объявления subprogram_declaration или generic_subprogram_declaration. Профиль тела subprogram_body, завершающего объявление, должен полностью соответствовать профилю объявления.
Статическая семантика
Тело подпрограммы subprogram_body рассматривается как объявление. Оно может либо завершить предыдущее объявление, либо само являться начальным объявлением подпрограммы.
Динамическая семантика
Выполнение тела не-обобщенной подпрограммы subprogram_body не имеет других последствий, кроме установления того, что подпрограмму можно вызывать без сбоя проверки Elaboration_Check.
Выполнение тела подпрограммы subprogram_body вызывается вызовом подпрограммы. Для этого выполнения блок declarative_part обрабатывается, а затем выполняется блок handled_sequence_of_statements.
Примеры
Пример тела процедуры:
procedure Push(E : in Element_Type; S : in out Stack) is
begin
if S.Index = S.Size then
raise Stack_Overflow;
else
S.Index := S.Index + 1;
S.Space(S.Index) := E;
end if;
end Push;
begin
if S.Index = S.Size then
raise Stack_Overflow;
else
S.Index := S.Index + 1;
S.Space(S.Index) := E;
end if;
end Push;
Пример тела функции:
function Dot_Product(Left, Right : Vector) return Real is
Sum : Real := 0.0;
begin
Check(Left'First = Right'First and Left'Last = Right'Last);
for J in Left'Range loop
Sum := Sum + Left(J)*Right(J);
end loop;
return Sum;
end Dot_Product;
Sum : Real := 0.0;
begin
Check(Left'First = Right'First and Left'Last = Right'Last);
for J in Left'Range loop
Sum := Sum + Left(J)*Right(J);
end loop;
return Sum;
end Dot_Product;