Руководство по Ada (Ada 2022)
6.8 Функции выражений
Оператор expression_function_declaration предоставляет сокращённую запись для объявления функции, тело которой состоит из единственного оператора возврата.
Синтаксис
expression_function_declaration ::=
[overriding_indicator]
function_specification is
(expression)
[aspect_specification];
| [overriding_indicator]
function_specification is
aggregate
[aspect_specification];
[overriding_indicator]
function_specification is
(expression)
[aspect_specification];
| [overriding_indicator]
function_specification is
aggregate
[aspect_specification];
Правила разрешения имён
Ожидаемый тип для выражения или агрегата в expression_function_declaration — тип результата (см. 6.5) функции.
Статические семантические правила
expression_function_declaration, не являющаяся дополнением, объявляет функцию-выражение. Возвращаемое выражение функции-выражения — это выражение или агрегат из expression_function_declaration. Дополнение для expression_function_declaration недопустимо; однако expression_function_declaration может дополнить предыдущее объявление.
Потенциально статическое выражение определяется так же, как статическое выражение, за исключением того, что
- имя, обозначающее формальный параметр функции-выражения, является потенциально статическим выражением; и
- каждое использование «статического выражения» в определении «статического выражения» заменяется соответствующим использованием «потенциально статического выражения» в определении «потенциально статического выражения».
Для функции-выражения может быть указан следующий определяемый языком аспект представления:
Статический
Тип аспекта Static — Boolean. Если для функции-выражения аспект Static имеет значение True, функция является статической функцией-выражением. Если указан напрямую, aspect_definition должен быть статическим выражением.
Значение Static для унаследованной функции равно True, если какая-то соответствующая примитивная функция родительского или предкового типа является статической функцией-выражением; в противном случае, если не указано напрямую, аспект равен False.
Статическая функция-выражение — это статическая функция; см. 4.9.
Правила легальности
Если expression_function_declaration является дополнением, оно должно быть дополнением subprogram_declaration или generic_subprogram_declaration. Профили expression_function_declaration, дополняющего объявление, должны полностью соответствовать профилю объявления.
Если тип результата имеет один или несколько неуточнённых дискриминантов доступа, уровень доступности анонимного типа доступа каждого дискриминанта доступа, как определённо выражением или агрегатом expression_function_declaration, не должен быть статически глубже, чем у главного, который подготовил expression_function_declaration.
Аспект Static должен быть задан со значением True только в том случае, если связанное expression_function_declaration:
- не является дополнением;
- имеет выражение, являющееся потенциально статическим выражением;
- не содержит обращений к себе;
- каждый параметр (если есть) имеет режим in и статический подтип;
- имеет тип результата, который является статическим подтипом;
- не имеет применимых условий предварительной или последующей проверки; и
- для типа результата R, если функция является граничным объектом для типа R (см. 7.3.2), к типу R не применяются никакие инварианты типа; если R имеет тип компонента C, аналогичное правило применяется к C.
Абзац 6 был удалён.
Динамические семантические правила
Вызов функции-выражения осуществляется посредством вызова подпрограммы. При выполнении вызова подпрограммы на функции-выражении или на функции, завершённой с помощью expression_function_declaration, выполнение subprogram_body выполняет неявное тело функции, содержащее только simple_return_statement, чьё выражение является возвращаемым выражением функции-выражения.
Выполнение expression_function_declaration не имеет других последствий, кроме установления возможности вызова функции-выражения без нарушения Elaboration_Check.
Примеры
Пример функции-выражения:
function Is_Origin (P : in Point) return Boolean is -- см. 3.9
(P.X = 0.0 and P.Y = 0.0);
(P.X = 0.0 and P.Y = 0.0);