Ada 2012 - 用自定义版本替换 Fixed_Decimal_Type'Round()?
Ada 2012 - replace Fixed_Decimal_Type'Round() with customised version?
最近我在为自定义记录类型提供自己的替换 'Write ()
过程时取得了令人愉快的成功,例如...
type Pixel_Format is
record
-- blah blah
end record;
procedure Pixel_Format_Write (
Stream : not null access Root_Stream_Type'Class;
Item : in Pixel_Format);
for Pixel_Format'Write use Pixel_Format_Write;
我在写入网络流时使用它来将某些记录成员从小端转换为大端。干得漂亮。
出于同样的想法,我想知道是否可以替换十进制定点类型的 'Round ()
函数,所以我尝试了一个快速而肮脏的测试...
-- This is a "Decimal Fixed Point" type
type Money_Dec_Type is delta 0.001 digits 14;
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base;
for Money_Dec_Type'Round use Money_CustomRound; -- COMPILER COMPLAINS HERE
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base is
begin
return 0.001;
end Money_CustomRound;
唉,GNAT 认为这令人反感:
attribute "Round" cannot be set with definition clause
问题:
我是在尝试不可能的事情吗?或者有没有办法改变默认的 'Round
属性,就像改变 'Write
一样?
问题背景:
我有一套大约 15 种不同的舍入货币值的方法,这些方法从一个项目到另一个项目(有时在同一个项目中!)。示例包括:
- 从零开始取整(似乎是 Ada 的默认值)
- 向零舍入一半
- 统计(需要全局管理的可重入类型)
- 四舍五入或赔率
- 向 +INF / -INF 舍入
- ...
通过使用在通用包级别定义的某些舍入方法,能够使这种功能对程序员透明,这将是一个强大的工具。
我另一边肩膀上的天使暗示我在要求一些完全疯狂的东西。
我想知道这一点,因为文档(ALRM 和 "Barnes 2012")都给出了默认过程的功能规范。如果不能用自己的设计替换它,他们为什么要这样做?
最近我在为自定义记录类型提供自己的替换 'Write ()
过程时取得了令人愉快的成功,例如...
type Pixel_Format is
record
-- blah blah
end record;
procedure Pixel_Format_Write (
Stream : not null access Root_Stream_Type'Class;
Item : in Pixel_Format);
for Pixel_Format'Write use Pixel_Format_Write;
我在写入网络流时使用它来将某些记录成员从小端转换为大端。干得漂亮。
出于同样的想法,我想知道是否可以替换十进制定点类型的 'Round ()
函数,所以我尝试了一个快速而肮脏的测试...
-- This is a "Decimal Fixed Point" type
type Money_Dec_Type is delta 0.001 digits 14;
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base;
for Money_Dec_Type'Round use Money_CustomRound; -- COMPILER COMPLAINS HERE
-- ...
function Money_CustomRound(X : in Money_Dec_Type)
return Money_Dec_Type'Base is
begin
return 0.001;
end Money_CustomRound;
唉,GNAT 认为这令人反感:
attribute "Round" cannot be set with definition clause
问题:
我是在尝试不可能的事情吗?或者有没有办法改变默认的 'Round
属性,就像改变 'Write
一样?
问题背景:
我有一套大约 15 种不同的舍入货币值的方法,这些方法从一个项目到另一个项目(有时在同一个项目中!)。示例包括:
- 从零开始取整(似乎是 Ada 的默认值)
- 向零舍入一半
- 统计(需要全局管理的可重入类型)
- 四舍五入或赔率
- 向 +INF / -INF 舍入
- ...
通过使用在通用包级别定义的某些舍入方法,能够使这种功能对程序员透明,这将是一个强大的工具。
我另一边肩膀上的天使暗示我在要求一些完全疯狂的东西。
我想知道这一点,因为文档(ALRM 和 "Barnes 2012")都给出了默认过程的功能规范。如果不能用自己的设计替换它,他们为什么要这样做?