2015-10-13 23 views
1

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

我的问题是,你不是怎么做的,而是正确的做法是什么?另外,为什么Ada可以像+(例如1 + 2 + 3)那样执行(似乎是基于堆栈的操作),但是它不能对函数调用的参数执行相同的操作?

难道不是像 Max(1, 2, 3, ..., n)一样不要做可变表情吗?还是仅仅是你应该把参数传递给它,如Args.len=n; Max(Args[])

我的直觉和从阅读各种Ada书籍中收集到的信息表明,由于它们不太安全,因此不应该有非特定功能。

+1

http://stackoverflow.com/questions/8776677/calling-scanf-from-ada/8875664 对此深感抱歉! – Bronze

+0

我不明白'1 + 2 + 3'的部分。首先,没有任何关于它的堆栈。通常情况下,如果参数是变量,它会将寄存器添加到一起,并将结果放入另一个寄存器中,并且它不会靠近堆栈。其次,你的问题似乎意味着''可变'有关'+',但没有。 '“+”'是一个带有两个参数的函数,即句点。你想添加更多的数字,你必须多次调用该函数。你可以用Ada中的任何其他函数('Func(a,Func(b,Func(c,...)))')来完成。 – ajb

+0

我明白为什么它会令人困惑。我也看到我的逻辑错误。在我的学校教育中,我听说大多数计算器都是用堆栈计算的,深夜我问的问题更有意义。 – Bronze

回答

3

如建议here,“可变参数函数可能暴露某些语言中的类型安全问题”。虽然Ada不支持可变参数函数,但看到的示例here模仿的array aggregate行为。可变参数列表所带来的风险通常在于允许原始输入数据直接传递给可执行代码。在Ada中插入的骨料排除了这种情况,同时又具有文体上的便利性。

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

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

包[XML_EZ_Out](https://packages.debian.org/wheezy/libxmlezout2-dev)使用此方法来指定作为XML元素的一部分输出的属性和相应的值。尽管它使用重载的“=”运算符。 –