Ну, это немного работы, так как у вас нет удобных сокращений для создания карт (или словарей).Это делает работу:
with Ada.Containers.Indefinite_Ordered_Maps;
with Ada.Text_IO; use Ada.Text_IO;
procedure Alubio is
Нам нужен указатель на подпрограмму, чтобы создать экземпляр Map
type Handler is access procedure (Hostname : String; Port : Integer);
Карта от строки до указателя на подпрограмму.Он должен быть «неопределенным», потому что тип String является неопределенным (не фиксированного размера), и его нужно «упорядочивать», потому что мы не хотим беспокоиться об объявлении хеш-функций и т. Д.
package Maps is new Ada.Containers.Indefinite_Ordered_Maps
(Key_Type => String,
Element_Type => Handler);
Мне нравится объявлять подпрограммы перед их определением, но здесь это не является строго обязательным
procedure Ssh (Hostname : String; Port : Integer);
procedure Mosh (Hostname : String; Port : Integer);
procedure Telnet (Hostname : String; Port : Integer);
Карта
Map : Maps.Map;
Демонстрационные подпрограммы
procedure Ssh (Hostname : String; Port : Integer) is
begin
Put_Line ("ssh, " & Hostname & Port'Image);
end Ssh;
procedure Mosh (Hostname : String; Port : Integer) is
begin
Put_Line ("mosh, " & Hostname & Port'Image);
end Mosh;
procedure Telnet (Hostname : String; Port : Integer) is
begin
Put_Line ("telnet, " & Hostname & Port'Image);
end Telnet;
begin
НастройкаКарта
Map.Insert ("ssh", Ssh'Access);
Map.Insert ("mosh", Mosh'Access);
Map.Insert ("telnet", Telnet'Access);
Вызов подпрограмм через Карту.Не совсем уверенный, зачем нужен .all
(разыменование указателя на подпрограмму), вы часто этого не делаете: здесь, без него, компилятор говорит «недопустимый вызов процедуры или ввода», указывая на Map
.
Map ("ssh").all ("s", 1);
Map ("mosh").all ("m", 2);
Map ("telnet").all ("t", 3);
end Alubio;
Выход:
$ ./alubio
ssh, s 1
mosh, m 2
telnet, t 3