【问题标题】:Variadic Ada Functions可变 Ada 函数
【发布时间】:2015-10-13 00:54:56
【问题描述】:

我正在研究 Ada,因为我对严格类型安全和编程合同的想法很感兴趣。 “永远编程”的想法很好。无论如何,真正的问题是 Ada 是否具有可变参数功能。在 SO suggests 上搜索 Ada 没有,正确的方法是使用一个不受约束的数组,其长度在运行时确定。

那么我的问题不是你是怎么做的,而是正确做的惯例是什么?

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

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

我的直觉以及从阅读各种 Ada 书籍中收集到的信息表明,您不应该使用不特定的功能,因为它们不太安全。

【问题讨论】:

  • 我不明白关于1+2+3 的部分。首先,它没有任何基于堆栈的东西。通常,如果参数是变量,它会将寄存器添加在一起并将结果放入另一个寄存器,并且它不会靠近堆栈。其次,您的问题似乎暗示+ 有一些“变量”,但没有。 "+" 是一个接受两个参数的函数,句号。您想添加更多数字,您必须多次调用该函数。您可以使用 Ada 中的任何其他功能 (Func(a,Func(b,Func(c,...))))。
  • 我明白为什么会令人困惑。我也看到了我的逻辑不正确的地方。在我上学时,我被告知大多数计算器使用堆栈进行计算,而在深夜,我提出的问题更有意义。

标签: arrays ada variadic


【解决方案1】:

正如here 所建议的那样,“可变参数函数可能会暴露某些语言中的类型安全问题。”尽管 Ada 不支持可变参数函数,但看到的示例 here 模仿了在 array aggregate 中使用 operator overloading 的行为。可变参数列表带来的风险通常在于允许将原始输入数据直接传递给可执行代码。插入的聚合在 Ada 中排除了这一点,同时允许风格上的便利。

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

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

【讨论】:

  • XML_EZ_Out 使用这种方法来指定作为XML 元素的一部分输出的属性和相应的值。虽然它使用重载的“=”运算符。
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多