Языки программирования. Практический сравнительный анализ


Языки программирования. Практический сравнительный анализ - стр. 213


Например,

Т.all  := (тело => клиент, связь => null);

В этом присваивании использовано еще два соглашения Ады. В скобках изображено так называемое "составное значение" (агрегат), т.е. изображение конкретного значения составного типа, сразу все его поля (в данном случае - два поля). [В Фортране аналогично выглядит объявление начальных данных].

Чтобы в нижеследующем теле пакета все было понятным, осталось напомнить о правиле последовательного определения. Обратите внимание, тип "очередник" содержит поле "на_очередника", а тип "на_очередника" использует имя типа "очередник". Но ведь правило последовательного определения запрещает использовать имена до их объявления. Заметим, что для ссылочных типов приведенная ситуация естественна, ведь они и нужны, чтобы организовать соединения (структуры) динамических объектов.

Чтобы не нарушить принцип последовательного определения, в Аде применяют так называемое ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ имен, где не сообщают их характеристик. В результате на эти имена становится возможным ссылаться в последующих объявлениях.

package body очередь is

   type очередник; - - предварительное объявление

   type  на_очередника is  access очередник;

   type очередник is

      record

         тело: клиент;

         связь: на_очередника;

      end record ;

   первый, последний, новый: на_очередника;

   нет_клиентов : exeption ;

  procedure в_очередь (х: in клиент) is

   begin

      новый := new очередник; - - создается динамический объект

      новый.all := (тело => x, связь => null);

      if первый = null then

         первый := новый;

      else

         последний.связь := новый;

      end if ;

      последний := новый;

   end в_очередь;

  

   procedure из_очереди (х: out клиент) is

   begin

      if первый /= null then

         х := первый.тело;

         первый := первый.связь;

      else raise нет_клиентов;

      end if ;

   end из_очереди;

   function есть_клиенты return BOOLEAN is




- Начало -  - Назад -  - Вперед -