Справочник по Ada (Ada 2022)
A.1 Пакет Standard
Этот подпункт описывает спецификацию пакета Standard, содержащего все предопределенные идентификаторы языка. Соответствующий пакет тела не определен языком.
Операторы, предопределенные для типов, объявленных в пакете Standard, приведены в комментариях, так как они объявлены неявно. Курсив используется для псевдоимен типов без имени (например, root_real) и для неопределенной информации (например, определяемой реализацией).
Статическая семантика
Пакет библиотеки Standard имеет следующее объявление:
package Standard
with Pure is
with Pure is
type Boolean is (False, True);
-- Предопределенные реляционные операторы для этого типа:
-- function "=" (Left, Right : Boolean'Base) return Boolean;
-- function "/=" (Left, Right : Boolean'Base) return Boolean;
-- function "<" (Left, Right : Boolean'Base) return Boolean;
-- function "<=" (Left, Right : Boolean'Base) return Boolean;
-- function ">" (Left, Right : Boolean'Base) return Boolean;
-- function ">=" (Left, Right : Boolean'Base) return Boolean;
-- function "/=" (Left, Right : Boolean'Base) return Boolean;
-- function "<" (Left, Right : Boolean'Base) return Boolean;
-- function "<=" (Left, Right : Boolean'Base) return Boolean;
-- function ">" (Left, Right : Boolean'Base) return Boolean;
-- function ">=" (Left, Right : Boolean'Base) return Boolean;
-- Предопределенные логические операторы и оператор логического
-- отрицания:
-- отрицания:
-- function "and" (Left, Right : Boolean'Base) return Boolean'Base;
-- function "or" (Left, Right : Boolean'Base) return Boolean'Base;
-- function "xor" (Left, Right : Boolean'Base) return Boolean'Base;
-- function "or" (Left, Right : Boolean'Base) return Boolean'Base;
-- function "xor" (Left, Right : Boolean'Base) return Boolean'Base;
-- function "not" (Right : Boolean'Base) return Boolean'Base;
-- Тип целых чисел root_integer и соответствующий универсальный тип universal_integer предопределены.
type Integer is range определяемой реализацией;
subtype Natural is Integer range 0 .. Integer'Last;
subtype Positive is Integer range 1 .. Integer'Last;
subtype Positive is Integer range 1 .. Integer'Last;
-- Предопределенные операторы для типа Integer:
-- function "=" (Left, Right : Integer'Base) return Boolean;
-- function "/=" (Left, Right : Integer'Base) return Boolean;
-- function "<" (Left, Right : Integer'Base) return Boolean;
-- function "<=" (Left, Right : Integer'Base) return Boolean;
-- function ">" (Left, Right : Integer'Base) return Boolean;
-- function ">=" (Left, Right : Integer'Base) return Boolean;
-- function "/=" (Left, Right : Integer'Base) return Boolean;
-- function "<" (Left, Right : Integer'Base) return Boolean;
-- function "<=" (Left, Right : Integer'Base) return Boolean;
-- function ">" (Left, Right : Integer'Base) return Boolean;
-- function ">=" (Left, Right : Integer'Base) return Boolean;
-- function "+" (Right : Integer'Base) return Integer'Base;
-- function "-" (Right : Integer'Base) return Integer'Base;
-- function "abs" (Right : Integer'Base) return Integer'Base;
-- function "-" (Right : Integer'Base) return Integer'Base;
-- function "abs" (Right : Integer'Base) return Integer'Base;
-- function "+" (Left, Right : Integer'Base) return Integer'Base;
-- function "-" (Left, Right : Integer'Base) return Integer'Base;
-- function "*" (Left, Right : Integer'Base) return Integer'Base;
-- function "/" (Left, Right : Integer'Base) return Integer'Base;
-- function "rem" (Left, Right : Integer'Base) return Integer'Base;
-- function "mod" (Left, Right : Integer'Base) return Integer'Base;
-- function "-" (Left, Right : Integer'Base) return Integer'Base;
-- function "*" (Left, Right : Integer'Base) return Integer'Base;
-- function "/" (Left, Right : Integer'Base) return Integer'Base;
-- function "rem" (Left, Right : Integer'Base) return Integer'Base;
-- function "mod" (Left, Right : Integer'Base) return Integer'Base;
-- function "**" (Left : Integer'Base; Right : Natural)
-- return Integer'Base;
-- return Integer'Base;
-- Спецификация каждого оператора для типа
-- root_integer, или для любого дополнительного предопределенного типа целых чисел,
-- получается заменой Integer именем типа в спецификации соответствующего оператора типа
-- Integer. Правый операнд оператора возведения в степень остается подтипом Natural.
-- root_integer, или для любого дополнительного предопределенного типа целых чисел,
-- получается заменой Integer именем типа в спецификации соответствующего оператора типа
-- Integer. Правый операнд оператора возведения в степень остается подтипом Natural.
-- Тип чисел с плавающей запятой root_real и соответствующий универсальный тип universal_real предопределены.
type Float is digits определяемой реализацией;
-- Предопределенные операторы для этого типа:
-- function "=" (Left, Right : Float) return Boolean;
-- function "/=" (Left, Right : Float) return Boolean;
-- function "<" (Left, Right : Float) return Boolean;
-- function "<=" (Left, Right : Float) return Boolean;
-- function ">" (Left, Right : Float) return Boolean;
-- function ">=" (Left, Right : Float) return Boolean;
-- function "/=" (Left, Right : Float) return Boolean;
-- function "<" (Left, Right : Float) return Boolean;
-- function "<=" (Left, Right : Float) return Boolean;
-- function ">" (Left, Right : Float) return Boolean;
-- function ">=" (Left, Right : Float) return Boolean;
-- function "+" (Right : Float) return Float;
-- function "-" (Right : Float) return Float;
-- function "abs" (Right : Float) return Float;
-- function "-" (Right : Float) return Float;
-- function "abs" (Right : Float) return Float;
-- function "+" (Left, Right : Float) return Float;
-- function "-" (Left, Right : Float) return Float;
-- function "*" (Left, Right : Float) return Float;
-- function "/" (Left, Right : Float) return Float;
-- function "-" (Left, Right : Float) return Float;
-- function "*" (Left, Right : Float) return Float;
-- function "/" (Left, Right : Float) return Float;
-- function "**" (Left : Float; Right : Integer'Base) return Float;
-- Спецификация каждого оператора для типа root_real, или для
-- любого дополнительного предопределенного типа чисел с плавающей запятой,
-- получается заменой Float именем типа в спецификации соответствующего оператора типа
-- Float.
-- любого дополнительного предопределенного типа чисел с плавающей запятой,
-- получается заменой Float именем типа в спецификации соответствующего оператора типа
-- Float.
-- Кроме того, следующие операторы предопределены для корневых числовых типов:
function "*" (Left : root_integer; Right : root_real)
return root_real;
return root_real;
function "*" (Left : root_real; Right : root_integer)
return root_real;
return root_real;
function "/" (Left : root_real; Right : root_integer)
return root_real;
return root_real;
-- Тип universal_fixed предопределен.
-- Единственными операторами умножения, определенными между
-- типами с фиксированной запятой, являются
-- Единственными операторами умножения, определенными между
-- типами с фиксированной запятой, являются
function "*" (Left : universal_fixed; Right : universal_fixed)
return universal_fixed;
return universal_fixed;
function "/" (Left : universal_fixed; Right : universal_fixed)
return universal_fixed;
return universal_fixed;
-- Тип universal_access предопределен.
-- Следующие операторы равенства предопределены:
-- Следующие операторы равенства предопределены:
function "=" (Left, Right: universal_access) return Boolean;
function "/=" (Left, Right: universal_access) return Boolean;
function "/=" (Left, Right: universal_access) return Boolean;
-- Предопределенные операторы для типа Character такие же, как и для
-- любого типа перечисления.
-- любого типа перечисления.
-- Объявление типа Wide_Character основано на стандартном наборе символов ISO/IEC 10646:2020 BMP. Первые 256 позиций имеют то же содержимое, что и тип Character. См. 3.5.2.
type Wide_Character is (nul, soh ... Hex_0000FFFE, Hex_0000FFFF);
type Wide_Character is (nul, soh ... Hex_0000FFFE, Hex_0000FFFF);
-- Объявление типа Wide_Wide_Character основано на полном
-- наборе символов ISO/IEC 10646:2020. Первые 65536 позиций имеют то же
-- содержимое, что и тип Wide_Character. См. 3.5.2.
type Wide_Wide_Character is (nul, soh ... Hex_7FFFFFFE, Hex_7FFFFFFF);
for Wide_Wide_Character'Size use 32;
-- наборе символов ISO/IEC 10646:2020. Первые 65536 позиций имеют то же
-- содержимое, что и тип Wide_Character. См. 3.5.2.
type Wide_Wide_Character is (nul, soh ... Hex_7FFFFFFE, Hex_7FFFFFFF);
for Wide_Wide_Character'Size use 32;
-- Предопределенные типы строк:
type String is array(Positive range <>) of Character
with Pack;
type String is array(Positive range <>) of Character
with Pack;
-- Предопределенные операторы для этого типа:
-- function "=" (Left, Right: String) return Boolean;
-- function "/=" (Left, Right: String) return Boolean;
-- function "<" (Left, Right: String) return Boolean;
-- function "<=" (Left, Right: String) return Boolean;
-- function ">" (Left, Right: String) return Boolean;
-- function ">=" (Left, Right: String) return Boolean;
-- function "/=" (Left, Right: String) return Boolean;
-- function "<" (Left, Right: String) return Boolean;
-- function "<=" (Left, Right: String) return Boolean;
-- function ">" (Left, Right: String) return Boolean;
-- function ">=" (Left, Right: String) return Boolean;
-- function "&" (Left: String; Right: String) return String;
-- function "&" (Left: Character; Right: String) return String;
-- function "&" (Left: String; Right: Character) return String;
-- function "&" (Left: Character; Right: Character) return String;
END_OF_DOCUMENT_MARKER -- function "&" (Left: Character; Right: String) return String;
-- function "&" (Left: String; Right: Character) return String;
-- function "&" (Left: Character; Right: Character) return String;
тип Wide_String есть массив(Положительное диапазон <>) из Wide_Character
с Упаковкой;
с Упаковкой;
-- Предопределённые операторы для этого типа соответствуют операторам для String.
тип Wide_Wide_String есть массив (Положительное диапазон <>)
из Wide_Wide_Character
с Упаковкой;
из Wide_Wide_Character
с Упаковкой;
-- Предопределённые операторы для этого типа соответствуют операторам для String.
тип Duration есть дельта определяемая реализацией диапазон определяемая реализацией;
-- Предопределённые операторы для типа Duration такие же, как и для
--любого типа с фиксированной точкой.
--любого типа с фиксированной точкой.
-- Предопределённые исключения:
Constraint_Error: исключение;
Program_Error : исключение;
Storage_Error : исключение;
Tasking_Error : исключение;
Program_Error : исключение;
Storage_Error : исключение;
Tasking_Error : исключение;
конец Standard;
Стандарт не имеет закрытой части.
В каждом из типов Character, Wide_Character и Wide_Wide_Character символьные литералы для пробела (позиция 32) и неразрывного пробела (позиция 160) соответствуют различным значениям. Если не указано иное, каждый символ пробела ' ' в этом Справочном руководстве относится к пробелу. Аналогично, символьные литералы для дефиса (позиция 45) и мягкого дефиса (позиция 173) соответствуют различным значениям. Если не указано иное, каждый символ дефиса '–' в этом Справочном руководстве относится к символу дефиса.
Динамическая семантика
Выполнение тела Standard не оказывает никакого эффекта.
Разрешения реализации
Реализация может предоставить дополнительные предопределённые типы целых чисел и дополнительные предопределённые типы с плавающей точкой. Некоторые или все эти типы могут быть анонимными.
Рекомендации для реализации
Если реализация предоставляет дополнительные именованные предопределённые типы целых чисел, то имена должны заканчиваться на «Целое», как в «Длинное_Целое». Если реализация предоставляет дополнительные именованные предопределённые типы с плавающей точкой, то имена должны заканчиваться на «Вещественное», как в «Длинное_Вещественное».
ПРИМЕЧАНИЕ 1 Некоторые аспекты предопределённых сущностей не могут быть полностью описаны самим языком. Например, хотя тип перечисления Boolean можно записать, показывая два литерала перечисления False и True, краткие управляющие конструкции не могут быть выражены на языке.
ПРИМЕЧАНИЕ 2 Как объяснено в 8.1, «Область объявления» и 10.1.4, «Процесс компиляции», область объявления пакета Standard включает каждый модуль и, следовательно, главную подпрограмму; объявление каждого модуля предполагается внутри этой области объявления. Library_itemы предполагаются упорядоченными таким образом, что нет никаких семантических зависимостей вперёд. Однако, как объяснено в 8.3, «Видимость», единственные модули, которые видны внутри данного модуля компиляции, — это модули, указанные во всех with_clauses, которые применяются к данному модулю, и, кроме того, внутри области объявления данного модуля, сам этот модуль.
ПРИМЕЧАНИЕ 3 Если все block_statementы программы имеют имена, то имя каждого модуля всегда можно записать как расширенное имя, начиная со Standard (если Standard сам не скрыт). Имя модуля не может быть омографом имени (например, Integer), которое уже объявлено в Standard.
ПРИМЕЧАНИЕ 4 Исключение Standard.Numeric_Error определено в J.6.