当前位置:  开发笔记 > 前端 > 正文

您如何在Ada中存储(访问)Integer的运算符?

如何解决《您如何在Ada中存储(访问)Integer的运算符?》经验,为你挑选了1个好方法。

在Ada中,上下文可以确定“ +”不是字符串,而是整数运算符,如表达式:所示"+"(5,2)。问题是,如何将该运算符存储在变量中?我想将该整数运算符或其他一些运算符作为接受两个Integer并返回Integer的二进制函数传递。在下面的代码中,我做了一个明确的函数,它仅调用运算符,可以将其用作解决方法。有什么方法可以避免使用该包装器,而直接传递(访问)Integer的“ +”运算符?

with Ada.Text_IO; use Ada.Text_IO;

procedure operator is

  type binary_int_operator is access function(lhs : Integer; rhs : Integer) return Integer;

  --plus : binary_int_operator := Integer."+"'Access;
  --plus : binary_int_operator := Integer'Access("+");
  --plus : binary_int_operator := Integer'"+";
  --plus : binary_int_operator := "+";

  function plus(lhs : Integer; rhs : Integer) return Integer is
  begin
    return lhs + rhs;
  end plus;

begin
  Put_Line(Integer'Image("+"(5, 12)));
end operator;

带注释的声明显示了我所做的一些尝试,但未编译。



1> DeeDee..:

恐怕你做不到。所述"+"用于子程序Integer在包被定义Standard[ ARM A.1(17) ],并且因此固有[ AARM A.1(2.A) ]。不允许引用内部子程序[ ARM 3.10.2(32.3) ]。因此,编译程序

procedure Main is

   type Binary_Int_Operator is
     access function (lhs : Integer; rhs : Integer) return Integer;

   Plus : Binary_Int_Operator := Standard."+"'Access;

begin
   null;
end Main;

产量

6:34 prefix of "Access" attribute cannot be intrinsic

唯一的解决方法是使用间接寻址。该程序编译

with Ada.Text_IO;         use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main_Alt is

   type Operation is
     access function (Lhs, Rhs : Integer) return Integer;


   --  Sticking to "+" and "-" instead of names like Add or Subtract
   --  to demonstrate that you can reference operator subprograms
   --  (using the Access attribute) as long as they're not intrinsic.

   function "+" (Lhs, Rhs : Integer) return Integer is
     (Standard."+" (Lhs, Rhs));

   function "-" (Lhs, Rhs : Integer) return Integer is
     (Standard."-" (Lhs, Rhs));


   procedure Calc_And_Show (Lhs, Rhs : Integer; Op : Operation) is
   begin
      Put (Op (lhs, rhs));
      New_Line;
   end Calc_And_Show;

begin
   Calc_And_Show (5, 3, "+"'Access); 
   Calc_And_Show (5, 3, "-"'Access);
end Main_Alt;

和产量(如预期)

$ ./main_alt
          8
          2


是的,我也尝试过:-),但是最后重命名子程序只是获得原始子程序的视图。所有属性(包括其固有的调用约定)都被继承[[ARM 8.5.4(7)](http://www.ada-auth.org/standards/12rm/html/RM-8-5-4.html# p7)]。
我想知道您是否可以使用重命名..机器人
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有