Я бы предложил рассмотреть другой подход с использованием дженериков.Как правило, я думаю, что в итоге вы получаете более простой интерфейс для вызова, чем пытаетесь передать доступ к параметрам подпрограммы.(т.е. нет необходимости передавать операцию для каждого вызова).
Используя универсальные шаблоны, вам вообще не нужно использовать «Доступ», и вы можете передавать встроенные функции, такие как целое число »+ ", как формальные общие параметры.
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Main is
generic
with function Op (L, R : Integer) return Integer;
procedure Calc_And_Show (Lhs, Rhs : Integer);
procedure Calc_And_Show (Lhs, Rhs : Integer) is
begin
Put (Op (lhs, rhs));
New_Line;
end Calc_And_Show;
procedure Calc_And_Show_Plus is new Calc_And_Show (Op => "+");
procedure Calc_And_Show_Minus is new Calc_And_Show (Op => "-");
begin
Calc_And_Show_Plus (5, 3);
Calc_And_Show_Minus (5, 3);
end Main;
Могут быть причины, по которым вы хотите вместо этого использовать параметры доступа, например, если вы хотите, чтобы Calc_And_Show вызывался из других языков, таких как C, или есливы находитесь на уровне вложенного кода, и все, что вы передали на уровень вложенности, - это доступ к значению подпрограммы.Но я думаю, что в целом лучше использовать непатентованные средства или, по крайней мере, рассматривать этот вариант в качестве первого предпочтения, если у вас нет веских причин не делать этого.