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

7.2 Тела пакетов

В отличие от сущностей, объявленных в видимой части пакета, сущности, объявленные в теле_пакета, видны только внутри самого тела_пакета. Вследствие этого пакет с телом_пакета может использоваться для построения группы связанных подпрограмм, в которых логические операции, доступные клиентам, чётко изолированы от внутренних сущностей.

Синтаксис

тело_пакета ::=
package body имя_определяемого_программного_блока
[описание_аспекта] is
разделение_объявлений
[begin
обрабатываемая_последовательность_операторов]
end [[имя_родительского_блока.]идентификатор];
Если идентификатор или имя_родительского_блока.идентификатор появляется в конце тела_пакета, то эта последовательность лексем повторяет имя_определяемого_программного_блока.

Правила законности

Тело пакета должно быть завершением предыдущего объявления_пакета или объявления_обобщённого_пакета. Декларация пакета или обобщённого пакета библиотеки не должна иметь тело, если это не требуется; аспект Elaborate_Body может быть использован для требования наличия тела объявления_единицы_библиотеки (см. 10.2.1), если иначе оно не требуется.

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

В любом теле_пакета без операторов есть неявный пустой_оператор. Для любого объявления_пакета без явного завершения есть неявное тело_пакета, содержащее единственный пустой_оператор. Для неинстанцированного, небиблиотечного пакета это тело находится в конце раздела_объявлений самого внутреннего включающего программного блока или оператора_блока; если таких пакетов несколько, порядок неявных тел_пакетов не определён. (Для инстанции неявное тело_пакета появляется в месте инстанцирования (см. 12.3). Для библиотечного пакета место частично определяется зависимостями от выполнения (см. главу 10).)

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

Для выполнения тела необобщённого пакета сначала выполняется его раздел_объявлений, а затем выполняется его обрабатываемая_последовательность_операторов.
ПРИМЕЧАНИЕ 1 Переменная, объявленная в теле пакета, видна только внутри этого тела и, следовательно, её значение можно изменить только внутри тела_пакета. При отсутствии локальных задач значение такой переменной не изменяется между вызовами извне пакета подпрограммам, объявленным в видимой части. Свойства такой переменной похожи на свойства «статической» переменной C.
ПРИМЕЧАНИЕ 2 Выполнение тела подпрограммы, явно объявленной в видимой части пакета, вызывается выполнением тела пакета. Поэтому вызов такой подпрограммы внешней программой вызывает исключение Program_Error, если вызов происходит до выполнения тела_пакета (см. 3.11).

Примеры

Пример тела пакета (см. 7.1):
package body Rational_Numbers is
procedure Same_Denominator (X,Y : in out Rational) is
begin
-- приводит X и Y к общему знаменателю:
...
end Same_Denominator;
function "="(X,Y : Rational) return Boolean is
U : Rational := X;
V : Rational := Y;
begin
Same_Denominator (U,V);
return U.Numerator = V.Numerator;
end "=";
function "/" (X,Y : Integer) return Rational is
begin
if Y > 0 then
return (Numerator => X, Denominator => Y);
else
return (Numerator => -X, Denominator => -Y);
end if;
end "/";
function "+" (X,Y : Rational) return Rational is ... end "+";
function "-" (X,Y : Rational) return Rational is ... end "-";
function "*" (X,Y : Rational) return Rational is ... end "*";
function "/" (X,Y : Rational) return Rational is ... end "/";
end Rational_Numbers;


Spec-Zone.ru

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