Ada中在哪里评估默认参数?

时间:2019-05-02 01:57:56

标签: ada default-parameters

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

procedure Example(param1 : Integer := 1);

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

我尝试搜索ARM 2012,但在整个文档的任何地方都找不到“默认参数”。因此,然后我检查了6.4和6.4.1,其中ARM似乎将相关部分称为“默认表达式”。但是,“默认表达式”链接到3.7判别式。这可能可以用来减少定义某些内容的次数,但是,如果这是两个概念的共同点,那么他们应该做程序员应该做的事情,并分别进行定义。这种跳跃令人困惑,并且似乎是一个错误。

说明59如下:

  

创建类型不受限制的子类型的对象时,将评估该类型的判别式的default_expression。

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

那么,子例程的“默认表达式”何时真正得到计算?

2 个答案:

答案 0 :(得分:4)

您一直在寻找正确的位置,但是您一定错过了RM 6.4 10/2中的重要部分:

  

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

答案 1 :(得分:2)

发布此问题后不久,我发现了它。

6.4.1 6.25/3读为:

  

对于呼叫,作为呼叫一部分评估的任何default_expression均被视为呼叫的一部分。