我如何(可能?)从泛型中导出基于 "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
- 一开始我直接贴了包Command_String_Type是新的Ada.Strings...构造--然后收到错误。
- 这是上面“target”标题下的代码。
- 我认为 .ADS 文件中的类型声明会起作用,因为错误抱怨 "no type" -- 我又遇到错误了。
- 然后我在使用 Subtype 时也遇到了错误。
- (更新...) 声明 Command_String_Type 为 private -- 仍有编译错误
- 我最后的努力是创建 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;
我很确定这是 新 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
- 一开始我直接贴了包Command_String_Type是新的Ada.Strings...构造--然后收到错误。
- 这是上面“target”标题下的代码。
- 我认为 .ADS 文件中的类型声明会起作用,因为错误抱怨 "no type" -- 我又遇到错误了。
- 然后我在使用 Subtype 时也遇到了错误。
- (更新...) 声明 Command_String_Type 为 private -- 仍有编译错误
- 我最后的努力是创建 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;