Ada 202x提案@限制理由?

Ada 202x提案@限制理由?,ada,Ada,我对拟议的Ada 202x标准有一个问题。具体来说,我想知道目标名称(@)功能的限制。似乎此功能仅在赋值语句中可用,而在记录或数组聚合中不可用。这项限制背后的理由是什么 解释为什么我认为扩大目标名称的范围是有用的。比较这两个函数 根据我对拟议标准的理解,实施: function Mutate (State : Some_State) return Some_State is (State with delta Internal_Component => (State.Interna

我对拟议的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 Result;
end Mutate;

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

PS:有足够声誉的人是否应该创建“Ada-202x”标记?它正在进行中,肯定会有更多的问题。“Ada-2012”已经是一个标签了。我相信这里没有人有资格回答这个问题。试试这个,尽管我认为你已经来不及在2020年影响任何事情了。在任何情况下,这都不是一个合适的堆栈溢出问题。我认为这可能是我问题的答案。我不知道该如何参加我正在阅读的讨论。我只知道它没有解决我的问题。谢谢。我会说,你想要的例子似乎与预期用途不同。在赋值语句中,@符号表示赋值的LHS。在您想要的示例中,您希望它表示分配的输入(状态:some_state)。LHS将是“返回值”,这就是为什么您的最后一个示例会起作用(结果是赋值的LHS)。您的建议要求@符号在不同的上下文中表示不同的事物。我不研究ARG,所以这只是我的解释,尽管(很明显是盐粒),它在赋值时与delta aggregate或delta aggregate中的delta aggregate不明确。也许这些情况中的大多数可以通过特殊的重载规则来解决,但是Ada的设计是为了避免歧义和复杂的解决规则。PS:有足够声誉的人应该创建“Ada-202x”标签吗?它正在进行中,肯定会有更多的问题。“Ada-2012”已经是一个标签了。我相信这里没有人有资格回答这个问题。试试这个,尽管我认为你已经来不及在2020年影响任何事情了。在任何情况下,这都不是一个合适的堆栈溢出问题。我认为这可能是我问题的答案。我不知道该如何参加我正在阅读的讨论。我只知道它没有解决我的问题。谢谢。我会说,你想要的例子似乎与预期用途不同。在赋值语句中,@符号表示赋值的LHS。在您想要的示例中,您希望它表示分配的输入(状态:some_state)。LHS将是“返回值”,这就是为什么您的最后一个示例会起作用(结果是赋值的LHS)。您的建议要求@符号在不同的上下文中表示不同的事物。我不研究ARG,所以这只是我的解释,尽管(很明显是盐粒),它在赋值时与delta aggregate或delta aggregate中的delta aggregate不明确。也许这些情况中的大多数可以用特殊的重载规则来解决,但是Ada的设计是为了避免歧义和复杂的解决规则。