在Ada中隐藏某些操作符

在Ada中隐藏某些操作符,ada,intrinsics,Ada,Intrinsics,假设我有以下类型: 类型示例\u类型为新浮点; 将定义大量的内在运算符,例如_类型,这在绝大多数情况下都很好。比如: 函数“+”(左、右:示例类型)返回示例类型; 及 函数“*”(左、右:示例类型)返回示例类型; 但是让我们假设两个示例类型的乘法不应该等于另一个示例类型,就像维度发生的情况一样。如何有选择地隐藏这些内在运算符?将不允许的操作抽象化: 不允许的过程是 输入长度为10位; 函数“*”(左、右:长度)返回长度是抽象的; A、 B,C,D:长度:=2.0; 开始 C:=A+B; D

假设我有以下类型:

类型示例\u类型为新浮点;
将定义大量的内在运算符,例如_类型,这在绝大多数情况下都很好。比如:

函数“+”(左、右:示例类型)返回示例类型;

函数“*”(左、右:示例类型)返回示例类型;

但是让我们假设两个示例类型的乘法不应该等于另一个示例类型,就像维度发生的情况一样。如何有选择地隐藏这些内在运算符?

将不允许的操作抽象化:

不允许的过程是
输入长度为10位;
函数“*”(左、右:长度)返回长度是抽象的;
A、 B,C,D:长度:=2.0;
开始
C:=A+B;
D:=A*C;——我会在这里抱怨的。
不允许结束;

将不允许的操作抽象化:

不允许的过程是
输入长度为10位;
函数“*”(左、右:长度)返回长度是抽象的;
A、 B,C,D:长度:=2.0;
开始
C:=A+B;
D:=A*C;——我会在这里抱怨的。
不允许结束;

必须定义一个重载函数,该函数生成所需类型的结果。虽然有时需要禁用内部运算符定义,但不必这样做以获得所需的运算符定义

类型示例\u类型为新浮点;
其他类型为新浮点数;
函数“*”(左、右:示例_类型)返回其他_类型;

Ada可以根据函数的返回类型解决重载问题。

必须定义一个重载函数,该函数生成所需类型的结果。虽然有时需要禁用内部运算符定义,但不必这样做以获得所需的运算符定义

类型示例\u类型为新浮点;
其他类型为新浮点数;
函数“*”(左、右:示例_类型)返回其他_类型;

Ada可以根据函数的返回类型解决重载问题。

您可以将它们重写为抽象的,但我认为这是错误的方法。与其试图摆脱操作,通常最好将类型声明为只包含所需的操作:

type Example is private;

function "+" (Left : Example; Right : Example) return Example;
-- "*" not defined
对于以其他方式为数字的类型,此操作的问题是不能将数字文本用于该类型。这可以通过以下方式有所缓解:

function "+" (Right : Integer) return Example;

因此,您可以编写
+42
,而不是
42
,这并不太糟糕,尽管在使用二进制运算符时仍然很尴尬:
X/(+42)
您可以将它们重写为抽象的,但我认为这是错误的方法。与其试图摆脱操作,通常最好将类型声明为只包含所需的操作:

type Example is private;

function "+" (Left : Example; Right : Example) return Example;
-- "*" not defined
对于以其他方式为数字的类型,此操作的问题是不能将数字文本用于该类型。这可以通过以下方式有所缓解:

function "+" (Right : Integer) return Example;

因此,您可以编写
+42
,而不是
42
,这并不太糟糕,尽管在使用二进制运算符时仍然很尴尬:
X/(+42)

我非常清楚如何定义新的运算符。这根本不是问题所在。除了可以说是唯一的命名约定之外,定义任何其他函数都没有区别。这并没有隐藏内在的函数,正是因为运算符在返回类型和参数上都会过载。我非常清楚如何定义新的运算符。这根本不是问题所在。除了可以说是唯一的命名约定之外,定义任何其他函数都没有区别。这并没有隐藏内在的函数,正是因为运算符在返回类型和参数上都会重载。实际上已经这样做了。除非为操作符手工编写程序集,否则即使在-O2处,GNAT也会出现额外的副本,这会导致严重的速度减慢。有趣的是,我刚刚尝试过,使用一个私有类型和一个完整类型
type Number是新的整数
函数“+”(左:数字;右:数字)返回的数字是(数字(整数(左)+整数(右))比直接使用整数快了大约2.7倍。哪个编译器版本和哪个平台?Xubuntu 17.10上的GNAT 7.2.0。英特尔核心i7-6700HQ。我不明白为什么会有不同;随着类型转换的优化和函数调用的内联,我认为它们会是一样的。通过进一步的实验,我所做的计时似乎已经优化了。为了防止这种情况的发生,时间安排似乎差不多。1000次对“+”的调用给出了类似的时间安排,而私有类型的调用始终要快一点;1000000个电话有一半的时间是私人电话;100000000个电话也差不多,私人电话的通话时间延长了10%。虽然我不明白两者的区别,但这比我预想的要多。实际上,我已经做到了。除非为操作符手工编写程序集,否则即使在-O2处,GNAT也会出现额外的副本,这会导致严重的速度减慢。有趣的是,我刚刚尝试过,使用一个私有类型和一个完整类型
type Number是新的整数
函数“+”(左:数字;右:数字)返回的数字是(数字(整数(左)+整数(右))比直接使用整数快了大约2.7倍。哪个编译器版本和哪个平台?Xubuntu 17.10上的GNAT 7.2.0。英特尔核心i7-6700HQ。我不明白为什么会有不同;随着类型转换的优化和函数调用的内联,我认为它们会是一样的。通过进一步的实验,我所做的计时似乎已经优化了。为了防止这种情况的发生,时间安排似乎差不多。1000次对“+”的调用给出了类似的时间安排,而私有类型的调用始终要快一点;1000000个电话有私人电话