可变 Ada 函数

Variadic Ada Functions

我正在研究 Ada,因为我对严格的类型安全和编程契约的想法很感兴趣。 "programming for forever" 的想法很好。不管怎样,真正的问题是 Ada 是否有可变函数。在 SO suggests 上搜索 Ada 不会搜索,正确的方法是使用长度在运行时确定的无约束数组。

那么我的问题不是您如何做,而是正确做事的惯例是什么?

此外,为什么 Ada 可以执行(看起来是基于堆栈的)操作,如 +(例如 1+2+3),但它不能对函数调用的参数执行相同的操作?

完全不做可变参数表达式是否更惯用 Max(1, 2, 3, ..., n),或者只是你应该像 Args.len=n; Max(Args[])?

那样将参数传递给它

我的直觉和我从阅读各种 Ada 书籍中收集到的信息表明,你不应该拥有不明确的功能,因为它们不太安全。

按照建议 here, "variadic functions can expose type-safety problems in some languages." Although Ada does not support variadic functions, the example seen here mimics the behavior using operator overloading in an array aggregate。可变参数列表带来的风险通常在于允许将原始输入数据直接传递给可执行代码。插入的聚合在 Ada 中排除了这一点,同时允许风格上的便利。

在下面的片段中,重载的 + 函数将每个字符串文字转换为 Unbounded_String,并且每个这样的 Unbounded_String 成为 Variadic_Array 的组成部分,这然后成为 Print_Line 函数的唯一参数。如果任何 prescribed checks 失败,则引发 Constraint_Error

Print_Line((+"Mary", +"had", +"a", +"little", +"lamb."));