7.3. ТЕЛА ПАКЕТОВ

В отличие от понятий, описанных в видимом разделе спецификации пакета, понятия, описанные в теле пакета, видимы только внутри самого тела пакета. Поэтому пакет с телом пакета может быть использован для создания группы взаимосвязанных подпрограмм (пакет прикладных программ в обычном смысле), в которой доступные пользователям операции явно изолированы от внутренних понятий.

При предвыполнении тела пакета сначала предвыполняется его раздел описаний, а затем выполняется его последовательность операторов (если она имеется). Необязательно присутствующие в конце тела пакета обработчики исключений обслуживают исключения, возбуждаемые при выполнении последовательности операторов тела пакета.

Примечание. Переменная, описанная в теле пакета, видима только внутри этого тела, и, следовательно, ее значение может быть изменено только внутри этого тела пакета. В отсутствие локальных задач значение такой переменной сохраняется неизменным между вызовами извне пакета подпрограмм, описанных в его видимом разделе. Свойства такой переменной аналогичны свойствам «собственной» переменной в языке Алгол-60.

Предвыполнение тела подпрограммы, описанной в видимом разделе пакета, осуществляется при предвыполнении тела пакета. Следовательно, при вызове такой подпрограммы извне программного модуля возбуждается исключение PROGRAM-ERROR, если вызов производится до предвыполнения тела пакета (см. 3.9).

Пример пакета:

package RATIONAL-NUMBERS is   type RATIONAL is      record         NUMERATOR   : INTEGER;         DENOMINATOR : POSITIVE;      end record;   function EQUAL (X,Y  RATIONAL) return BOOLEAN;   function "/"    (X,Y  INTEGER) return RATIONAL; —- для образования рационального числа   function "+"    (X,Y  RATIONAL) return RATIONAL;   function "-"    (X,Y  RATIONAL) return RATIONAL;   function "*"    (X,Y  RATIONAL) return RATIONAL;   function "/"    (X,Y  RATIONAL) return RATIONAL;end;package body RATIONAL-NUMBERS is   procedure SAME-DENOMINATOR (X,Y : in out RATIONAL) is   begin       -- приведение Х и Y к общему знаменателю;   end;   function EQUAL(X,Y : RATIONAL) return BOOLEAN is      U,V : RATIONAL;   begin      U := X;      V := Y;      SAME-DENOMINATOR (U,V);      return ENUMERATOR = V.NUMERATOR;   end EQUAL;   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;

Ссылки: видимый раздел 7.2, имя 4.1, исключение 11, исключение PROGRAM-ERROR 11.1, ДЮЗ обработчик исключения 11.1, описание 3.1, переменная 3.2.1, подпрограмма б, последовательность операторов 5.1, Предвыполнение 3.1, 3.9, .программный модуль 6, раздел описаний 3.9, спецификация пакета 7.1.