首页 > 解决方案 > Ada 202x 提案@限制理由?

问题描述

我对提议的 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)

如果 delta 聚合可以隐式嵌套,这可能会导致非常干净:

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 Result;
end Mutate;

但这仍然不是很干净,并且严重阻碍了目标名称在非赋值表达式中的使用。

标签: ada

解决方案


推荐阅读