【问题标题】:Where are Default Parameters evaluated in Ada?Ada 中的默认参数在哪里评估?
【发布时间】:2019-09-20 12:31:49
【问题描述】:

所以我们知道 Ada 支持这样的默认参数

procedure Example(param1 : Integer := 1);

但我的问题是,默认参数在哪里评估?在我熟悉的所有语言中,默认参数只是插入到调用代码中,如果更改默认参数,则需要下游重新编译。 Ada 是否使用相同的方法?

我尝试搜索 ARM 2012,但在整个文档的任何地方都找不到“默认参数”。因此,我检查了 6.4 和 6.4.1,似乎 ARM 将相关部分称为“默认表达式”。然而,“默认表达式”链接到 3.7 判别式。这可能被用来减少定义某些东西的次数,但是如果这对两个概念是共同的,他们应该做程序员所做的事情并分别定义它;这个跳转很混乱,看起来像是一个错误。

注释 59 内容如下:

当创建该类型的无约束子类型的对象时,会评估该类型判别式的 default_expression。

好吧,这对于子例程调用没有任何意义。

同样,子例程的“默认表达式”何时真正被评估?

【问题讨论】:

    标签: ada default-parameters


    【解决方案1】:

    你一直在寻找正确的地方,但你一定错过了RM 6.4 10/2中的重要部分:

    10/2 对于子程序调用的执行,名称或前缀 调用被评估,并且每个 parameter_association 被评估 (见 6.4.1)。如果使用 default_expression,则隐式 此规则假定为 parameter_association。这些评价是 以任意顺序完成。

    【讨论】:

    • 结合 6.4.1 6.25/3,这绝对描述了整个情况。
    【解决方案2】:

    我在发布此问题后不久就找到了它。

    6.4.1 6.25/3 读作:

    对于调用,作为调用一部分评估的任何 default_expression 都被视为调用的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 2020-10-19
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多