Руководство по Ada (Ada 2022)
4.5.9 Выражения declare
Выражения declare позволяют объявлять локальные константы и переименования объектов в контексте выражения.
Синтаксис
В любом месте, где Правила Синтаксиса допускают выражение, может быть использовано declare_expression вместо выражения, при условии, что оно немедленно окружено скобками.
Правила допустимости
declare_item, являющийся object_declaration, должен объявлять константу неограниченного типа.
declare_item, являющийся object_renaming_declaration (см. 8.5.1), не должен переименовывать объект ограниченного типа, если любой оперативный элемент имени object_name является преобразованием значения или только что сконструированным (см. 4.4).
Следующие элементы не допускаются внутри declare_expression: объявление, содержащее зарезервированное слово aliased; attribute_designator Access или Unchecked_Access; или анонимный тип доступа.
Правила разрешения имен
Если ожидается, что declare_expression будет типа T, то ожидается, что body_expression будет типа T. Аналогично, если declare_expression должен разрешиться к типу T, то body_expression должен разрешиться к типу T.
Тип declare_expression — это тип body_expression.
Динамическая семантика
При вычислении declare_expression declare_itemы обрабатываются по порядку, а затем вычисляется body_expression. Значение declare_expression — это значение body_expression.
Примеры
Пример использования выражения declare как пост-условия для Ada.Containers.Vectors."&" (см. A.18.2):
with Post =>
(declare
Result renames Vectors."&"'Result;
Length : constant Count_Type := Left.Length + Right.Length;
begin
Result.Length = Length and then
not Tampering_With_Elements_Prohibited (Result) and then
not Tampering_With_Cursors_Prohibited (Result) and then
Result.Capacity >= Length)
(declare
Result renames Vectors."&"'Result;
Length : constant Count_Type := Left.Length + Right.Length;
begin
Result.Length = Length and then
not Tampering_With_Elements_Prohibited (Result) and then
not Tampering_With_Cursors_Prohibited (Result) and then
Result.Capacity >= Length)