Ну, в принципе все нормально. Только непонятно, почему ты оставил вот такие повторы:
function Div(Args: Vector) return F80 is
begin
if integer(Length(Args)) /= 2 then raise Invalid_Expression;
end if;
return Get_Value(Element(Args, 0)) / Get_Value(Element(Args, 1));
end;
function Pow(Args: Vector) return F80 is
begin
if integer(Length(Args)) /= 2 then raise Invalid_Expression;
end if;
return Get_Value(Element(Args, 0)) ** Get_Value(Element(Args, 1));
end;
? То же самое касается и умножения/сложения всех элементов вектора. Это ж одинаковые действия. Зачем дженерики тогда? Делаем так:
generic with function F(Left, Right : F80) return F80;
function TwoParams (Args : Vector) return F80;
function TwoParams (Args : Vector) return F80 is
begin
if integer(Length(Args)) /= 2 then raise Invalid_Expression;
end if;
return F(Get_Value(Element(Args, 0)), Get_Value(Element(Args, 1)));
end TwoParams;
function Div(Args: Vector) return F80 is
function MyFunc is new TwoParams ("/");
begin
return MyFunc(Args);
end;
function Pow(Args: Vector) return F80 is
function MyFunc is new TwoParams ("**");
begin
return MyFunc(Args);
end;
Еще не совсем понял, почему в Lib_Add_Funcs (при добавлении поддерживаемых функций) ты добавляешь Summ'access, вместо того, чтобы напрямую добавить Add'Access? Зачем вообще этот переходник Summ нужен? Закомментировал его, вроде и без него все нормально. Или я чего-то не увидел? Prod -> Mul тоже можно напрямую заменить...