Ада-95. Компилятор GNAT

       

Настраиваемый модуль как параметр настройки


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

В таком случае спецификация формального параметра может быть выполнена следующим образом:

generic

with package P is new P_G (<>); -- фактический параметр для P_G определяется package Module_G is ... -- в P_G как обычно, а также (new) в Module_G

Такой вид формального параметра настройки значительно упрощает импортирование целой абстракции.

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

Следовательно, вся абстракция типа данных, которая описывается настраиваемым пакетом, может быть импортирована очень просто.

Такой механизм подразумевает построение одной настраиваемой абстракции из другой настраиваемой абстракции или расширение уже существующей абстракции.

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

В качестве иллюстрации данного подхода рассмотрим спецификации двух взаимосвязанных абстрактных типов данных: комплексные числа и матрицы комплексных чисел.

Абстрактный тип данных комплексных чисел - это настраиваемый модуль с формальным параметром вещественного типа:



generic

type Float_Type is digits <>; package Complex_Numbers_G is

type Complex_Type is private; function Value (Re, Im : Float_Type) return Complex_Type; function "+" (Left, Right : Complex_Type) return Complex_Type; ... -- другие операции

private

type Complex_Type is record

Re, Im : Float_Type; end record; end Complex_Numbers_G;

Абстрактный тип данных матрицы комплексных чисел - это настраиваемый модуль с формальным параметром абстрактного типа данных комплексных чисел (то есть с любой конкретизацией настраиваемого пакета показанного выше):

with Complex_Numbers_G; generic with package Complex_Numbers is

new Complex_Numbers_G (<>); use Complex_Numbers; package Complex_Matrices_G is

type Matrix_Type is

array (Positive range <>, Positive range <>) of

Complex_Type; function "*" (Left : Complex_Type; Right : Matrix_Type) return Matrix_Type; ... -- другие операции

end Complex_Matrices_G;

Следующий пример показывает две типичные конкретизации абстрактных типов данных для выполнения вычислений с комплексными числами и матрицами:

package Complex_Numbers is

new Complex_Numbers_G (Float); package Complex_Matrices is

new Complex_Matrices_G (Complex_Numbers);

package Long_Complex_Numbers is

new Complex_Numbers_G (Long_Float); package Long_Complex_Matrices is

new Complex_Matrices_G (Long_Complex_Numbers);



Содержание раздела