我如何(可能?)从泛型中导出基于 "new" 类型的 Ada 类型?

How (may?) I export Ada type based on a "new" type from a generic?

我很确定这是 Ada 人的陷阱。我觉得需要做一些简单的事情才能做到这一点。我有一些较旧的代码,其中包含基于 Send_Command 类型参数的 Command_String_Type 过程的声明 Ada.Strings.Bounded通用模块。

 -- -- -- command.ads -- -- --

    -- nothing relevant, Send_command is/was internal to module.
     :

 -- -- -- command.adb -- -- --

    -- Type to hold command to send while it is being constructed.
 package Command_String_Type is
      new Ada.Strings.Bounded.Generic_Bounded_Length(Max => Command_Max);

     :
     :

 procedure   Send_Command( 
                 Command_String : in Command_String_Type.Bounded_String ); 

此:Command_String_Type 用作此模块必须从此模块导出的 Send_Command 过程的参数类型。

当我试图在模块规范 (.ads) 文件中声明 Command_String_Type 时,我的麻烦来了。我无法直接获得此过程的 'export' 这种类型规范的语法。

目标

 -- -- -- command_interface.ads -- -- --

 package Command_Interface is

      Command_Max : constant := 200;
        :

    -- WANTED ... export Command_String_Type from this module

    -- Type to hold command to send while it is being constructed.
   package Command_String_Type is
        new Ada.Strings.Bounded.Generic_Bounded_Length(Max => Command_Max);

     :
     :

   procedure   Send_Command( 
                   Command_String : in Command_String_Type.Bounded_String ); 
     :

 end Command_Interface; -- specification


 -- -- -- command_interface.adb -- -- --

 package body Command_Interface is

         :
   procedure   Send_Command( 
                   Command_String : in Command_String_Type.Bounded_String ) 
   is
   begin
         :
        -- implementation ...
         :
   end Send_Command;

 end Command_Interface; --package

很自然地,Ada-95 编译器想要一个“Command_String_Type”,如上所示。想将 Send_Command 程序放在 command_interface 包中。并将其导出以供其他模块使用。此过程取决于 Command_String_Type

  1. 一开始我直接贴了包Command_String_Type是新的Ada.Strings...构造--然后收到错误。
    • 这是上面“target”标题下的代码。
  2. 我认为 .ADS 文件中的类型声明会起作用,因为错误抱怨 "no type" -- 我又遇到错误了。
  3. 然后我在使用 Subtype 时也遇到了错误。
  4. (更新...) 声明 Command_String_Typeprivate -- 仍有编译错误
  5. 我最后的努力是创建 Command_String_Type 的 Command_String_Type_XX 子类型,这样我就可以在声明中公开该子类型。

到目前为止,我已经 none 五岁了。我一直在阅读书籍和查看培训笔记,我很失望找不到 'exports' 来自有界字符串的字符串类型的示例 - 当然,我仍在寻找,但是我'我开始怀疑我认为的东西是否像其他语言一样直截了当。这是否可能并允许 Ada. 提前感谢您的建议。

您提出的规范看起来不错:

with  Ada.Strings.Bounded;
package Command_Interface is
   Command_Max : constant := 200;
   package Command_String_Type is
     new Ada.Strings.Bounded.Generic_Bounded_Length (Max => Command_Max);
   procedure Send_Command
     (Command_String : in Command_String_Type.Bounded_String);
end Command_Interface;

body 也是如此(当然,这是一个演示):

with Ada.Text_IO;
package body Command_Interface is
   procedure Send_Command
     (Command_String : in Command_String_Type.Bounded_String) is
   begin
      Ada.Text_IO.Put_Line (Command_String_Type.To_String (Command_String));
   end Send_Command;
end Command_Interface;

现在我们开始使用它了。您已经在 Command_Interface 的可见部分创建了包 Command_String_Type,因此您可以将其引用为 Command_Interface.Command_String_Type:

with Command_Interface;
procedure Check_Command_Interface is
begin
   Command_Interface.Send_Command
     (Command_Interface.Command_String_Type.To_Bounded_String ("hello!"));
end Check_Command_Interface;

您可能认为这一切都变得有点冗长了。您可以缩短实例化的名称,例如

   package Command is
     new Ada.Strings.Bounded.Generic_Bounded_Length (Max => Command_Max);

或者您可以在调用附近使用包重命名技巧,

procedure Check_Command_Interface_2 is
   package CICST renames Command_Interface.Command_String_Type;
begin
   Command_Interface.Send_Command (CICST.To_Bounded_String ("hello!"));
end Check_Command_Interface_2;

或者你可以过火 use:

procedure Check_Command_Interface_3 is
   use Command_Interface.Command_String_Type;
begin
   Command_Interface.Send_Command (To_Bounded_String ("hello!"));
end Check_Command_Interface_3;