Предложение Ada 202x с обоснованием ограничения?

#ada

#ada

Вопрос:

У меня вопрос о предлагаемом стандарте Ada 202x. В частности, мне интересно узнать об ограничениях на функцию целевого имени ( @ ). Похоже, что эта функция будет доступна только в операторах присваивания, а не в агрегированных данных записей или массивов. Каково обоснование этого ограничения?

Чтобы объяснить, почему я думаю, было бы полезно расширить область действия целевого имени. Сравните эти две функции.

Реализация, насколько я понимаю, предлагаемого стандарта:

 function Mutate (State : Some_State) return Some_State is (State with delta
    Internal_Component => (State.Internal_Component with delta
        Component_Array => (State.Internal_Component.Component_Array with delta
            Array_Index => State.Internal_Component.Component_Array (Array_Index)   1,
            Other_Index => State.Internal_Component.Component_Array (Other_Index) - 1)));
  

Если бы функция целевого имени была расширена до агрегатов, то это могло бы быть:

 function Mutate (State : Some_State) return Some_State is (State with delta
    Internal_Component => (@ with delta   --  @ is State.Internal_Component
        Component_Array => (@ with delta  --  @ is State.Internal_Component.Component_Array
            Array_Index => @   1,         --  @ is State.Internal_Component.Component_Array (Array_Index)
            Other_Index => @ - 1)));      --  @ is State.Internal_Component.Component_Array (Other_Index)
  

Если бы дельта-агрегаты могли неявно вкладываться, это могло бы привести к очень чистому:

 function Clean_Mutate (State : Some_State) return Some_State is (State with delta
        Internal_Component.Component_Array => @ with delta (
            Array_Index => @   1,
            Other_Index => @ - 1));
  

Конечно, как написано, можно было бы использовать:

 function Mutate (State : Some_State) return Some_State is
    Result : Some_State := State;
begin
    Result.Internal_Component.Component_Array (Array_Index) := @   1;
    Result.Internal_Component.Component_Array (Other_Index) := @ - 1;
    return Resu<
end Mutate;
  

Но это все еще не совсем так чисто, и это серьезно затрудняет использование целевого имени в выражениях без присваивания.

Комментарии:

1. PS: Должен ли кто-нибудь с достаточной репутацией уже создать тег «Ada-202x»? Оно в пути, и по этому поводу обязательно возникнет больше вопросов. «Ada-2012» уже является тегом.

2. Я не верю, что здесь есть кто-нибудь, кто может ответить на это. Попробуйте список рассылки Ada-Comment , хотя я думаю, что будет слишком поздно что-либо менять в 2020 году. В любом случае, это неправильный вопрос о переполнении стека.

3. Тогда я бы сказал, что это, вероятно, ответ на мой вопрос. Я не был уверен, как именно присоединиться к обсуждению, которое я читал здесь . Все, что я знал, это то, что это не отвечало на мой вопрос. Спасибо.

4. Я скажу, что ваш желаемый пример выглядит как набор механик, отличный от предполагаемого использования. В инструкции присваивания знак @ представляет LHS присваивания. В вашем желаемом примере вы хотите, чтобы оно представляло входные данные для назначения (состояние: some_state). LHS будет «возвращаемым значением», вот почему ваш последний пример будет работать (результатом является LHS присваивания). То, что вы предлагаете, потребовало бы, чтобы символ @ означал разные вещи в разных контекстах. Я не работаю над аргументом, так что это всего лишь моя интерпретация (очевидно, что это соль)

5. Это было бы неоднозначно при назначении с дельта-агрегатом или с дельта-агрегатом внутри дельта-агрегата. Возможно, большинство из этих случаев можно разрешить с помощью специальных правил @-overloading, но Ada разработана, чтобы избежать двусмысленностей и сложных правил разрешения.