Неужели этим всем кто то пользуется? Не совсем понятно как это спасает от выстрелов в ноги. По мне так вызывает только рвотный рефлекс при попытке въехать в работу с типами в Аде. Тут еще нет тех типов которые тащит за собой GNAT. Потом при попытке выводить это в stdio или передавать в производные типы код начинает обрастать имиджами, компилятор кряхтит и глохнет. Я понимаю что это поднимает требования к проектированию проекта и заставляет делать отдельное продуманное ТЗ для типов, но как то все это чрезмерно для простого шлепания на мк и хелловордов.И, вероятно, это может делать код платформозависимым.
Max_Width: constant := 10_000; -- Константа имеет универсальный тип Universal_Integer совместимый с другими типами.
-- Производные типы:
type X2 is new Integer range 0 .. 100; -- X производный от типа Integer, с допустимым диапазоном от 0 до 100
type Y1 is range 0 .. 100; -- Тип Y описывается как тип с допустимым диапазоном от 0 до 100,
-- при его описании не указан тип-предок. В этом случае он производен от
-- типа Root_Integer(базовый тип для всех целочисленных типов).
-- Описания целочисленных статических переменных:
Count : Integer;
Amount : Integer := 0;
-- описания целочисленных констант(именованных):
Unity : constant Integer := 1;
Speed_of_Ligth : constant := 300_000; -- тип Universal_Integer
A_Month : Integer range 1 .. 12;
-- описания целочисленных типов и подтипов
subtype Months is Integer range 1 ..12; -- Ограниченный тип Integer, подтипы совместимы с базовыми типом и могут быть с ними "смешаны"
type File_Id is new Integer; -- Новый целочисленный тип
type Result_Range is new Integer range 1 .. 20_000; -- Новый целочисленный тип с объявленным ограничением
type Other_result_Range is range 1 .. 100_000; -- производный от Root_Integer, при этом компилятор будет выбирать подходящий размер целочисленного размера для удловлетворения задаваемого диапазона.
--Модульные типы (беззнаковые):
type Byte is mod 2 ** 8;
CountB : Byte := 255;
-- CountB := CountB +1; результат не вызовет исключения, CountB будет равен 0.
--Вещественные типы
type Float is digits 6 range -16#0.FFFF_FF#E+32 .. 16#0.FFFF_FF#E+32; -- -3.40282E+38 .. 3.40282E+38
type Velocity is new Float;
type Height is new Float; --нельзя случайно смешивать Velocity и Height без явного преобразования типов.
-- Вещественные типы с фиксированной точкой, тип Duration:
-- Представление чисел с фикс. точкой имеет более ограниченный диапазон значений и указанную абсолютную погрешность, которая задается как "delta" этого типа.
type Volt is delta 0.125 range 0.0 .. 255.0;
type Fraction is delta System.Fine_Delta range -1.0 .. 1.0; --четкое определение насколько тип должен быть точным, например позволяет контроллировать ошибки при округлении.