Function 需要Ada包函数标识符

Function 需要Ada包函数标识符,function,package,ada,Function,Package,Ada,学习Ada并尝试制作一个堆栈ADT,我正在使用这个网页来了解它。 八年 with Ada.Text_IO; use Ada.Text_IO; with Stack; use Stack; procedure EightQueens is begin put_line ("awd"); end EightQueens; stack.ads package Stack is function awd () return Integer; end Stack; stack.ad

学习Ada并尝试制作一个堆栈ADT,我正在使用这个网页来了解它。

八年

with Ada.Text_IO;
use Ada.Text_IO;
with Stack;
use Stack;

procedure EightQueens is
begin
    put_line ("awd");
end EightQueens;
stack.ads

package Stack is
    function awd () return Integer;
end Stack;
stack.adb

package body Stack is
    function awd () return integer is
    begin
        return 1;
    end awd;
end Stack;
错误是

stack.ads:2:19: identifier expected

我很确定我做的每件事都是正确的。

Ada不使用空括号来定义或调用函数或过程


作为将来的参考,“我很确定我做的一切都是正确的。”这句话是一个红旗,表明你几乎肯定做了错事。

只是想详细说明一下,Ada做出了一些语法决定,IMHO优于你在C-syntax语言中可能使用的语法

  • 没有参数的函数在其调用中不使用空括号。这允许您将contant更改为函数调用,而无需重新编码任何客户端
  • 数组像函数调用一样使用括号,而不是一些独特的语法。这允许您将数组常量更改为函数调用,而无需重新编码任何客户端

  • 从另一个角度来看,常量只是无参数函数的简化版本,因为当您可以不返回相同的值时。类似地,常量数组是参数化函数调用的简化版本,当您可以不返回相同的值时。如果您后来发现需要更复杂的实现,这不是客户的问题,也不应该影响他们的代码。

    不,您没有正确地完成所有操作。Ada中不允许使用空括号。只需在没有它们的情况下定义(并调用)你的函数。@egilhh:你应该把它作为一个答案。如果你决定这样做,在这里发表一条评论,标记我,我将删除我的答案。这不是Ada编程的理想资源,因为它在函数处停止,而且在任何情况下,它都是一个糟糕的网站(链接似乎是自动生成的,并将你带到完全不相关的页面)。网站上有一组很好的链接。我知道这是我的意图,但我从来都不相信这是个好主意。函数调用、常量和数组是不同的东西,它们看起来应该是不同的。我看不出让他们看起来像有什么好处。我不记得曾经利用过将常量或数组引用更改为函数调用的能力,或者相反。如果在表达式中看到一个简单的标识符,如果不跟踪其定义,就无法判断它是否有副作用。@KeithThompson-真的吗?我已经做了很多了。我想,不同的人有不同的工具箱。我承认这确实暗示了你提到的WRT副作用。如果你发现这是一个巨大的缺点,我可以理解你的观点。但我从来没有这样的感觉。(如果你对副作用有意外的机会,你必须非常厌恶C++。我用默认的构造函数做同样的事情,暗示转换构造函数,数组操作符重载等等)。我有一个例子给你,作为一种我可以用OpenGL绑定的方法,我可以把对象枚举作为强制的最小值,然后用函数调用替换它们,以获得作为函数表达式的实际数字。{实际上,我已经决定对泛型包使用参数来实现此目的。}是的,我之所以这么说,唯一的原因是该页面没有说不允许使用空括号。@TreeTree:我想,它也没有说它们是必需的或允许的。就这么说吧。