overloading predefined operators

56 views
Skip to first unread message

L. B.

unread,
Jun 24, 2022, 4:11:00 AMJun 24
to
I have a question regarding redefining of operators like "=". My dummy code is:

type my_float is new float;

-- This overloads the predefined equality operation:
function "=" (left, right : in my_float) return boolean is begin
....
end "="

a, b : my_float;

a := 0.01
b := 0.009;

-- This test uses the overloading equality test:
if a = b then -- uses the new "="
null;
end if;

-- For some reasons I still need access to the overloaded original "=" function:
if a = b then -- shall use the original "="
null;
end if;

What can I do ?

Dmitry A. Kazakov

unread,
Jun 24, 2022, 4:23:53 AMJun 24
to
Rename the inherited operation before killing it:

type M_Float is new Float;
function Equal (Left, Right : M_Float) return Boolean renames "=";
function "=" (Left, Right : M_Float) return Boolean;

--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

L. B.

unread,
Jun 24, 2022, 5:44:46 AMJun 24
to
Great. Thank you !!!

Jeffrey R.Carter

unread,
Jun 24, 2022, 6:47:13 AMJun 24
to
On 2022-06-24 10:10, L. B. wrote:
>
> type my_float is new float;
>
> function "=" (left, right : in my_float) return boolean is begin
> ....
> end "="
>
> a, b : my_float;
>
> a := 0.01
> b := 0.009;
>
> -- For some reasons I still need access to the overloaded original "=" function:
> if a = b then -- shall use the original "="
> null;
> end if;
>
> What can I do ?

With a derived type like this, you can convert back to the parent type:

if Float (A) = Float (B) then

With a completely new type, you can only name one of the operations "=". You
have to decide which one you want to call "=", and which one you want to call
something else, like Equal. So, for

type Real is digits 7;

you can either call your new operation Equal

function Equal (Left : in Real; Right : in Real) return Boolean;

which leave "=" for the predefined operation, or you can rename the predefined
operation to Equal as Kazakov has described

function Equal (Left : in Real; Right : in Real) return Boolean renames "=";
function "=" (Left : in Real; Right : in Real) return Boolean;

--
Jeff Carter
"[I]t is foolish to polish a program beyond the
point of diminishing returns, but most programmers
do too little revision; they are satisfied too
early."
Elements of Programming Style
189

Randy Brukardt

unread,
Jun 24, 2022, 11:18:41 PMJun 24
to
"Dmitry A. Kazakov" <mai...@dmitry-kazakov.de> wrote in message
news:t93sak$10r4$1...@gioia.aioe.org...
This was important enough to the Ada 95 team that they gave it a name -- "a
squirreling rename" (as in "squirreling away"). You'll find that in the
index of the AARM to this day.

There's actually some special rules which allow this rename in cases where
without those rules you wouldn't be able to do this. It's important in some
cases

I generally prefer to use prefix notation in such cases rather than renaming
(which is easy to get subtly wrong). Remember that you can call any Ada
operator as if it is a normal function. So:

if Standard."=" (A, B) then

gives you the original "=" (which is defined in Standard for
Standard.Float).

Randy.


L. B.

unread,
Jun 25, 2022, 1:58:44 AMJun 25
to
Randy,

> I generally prefer to use prefix notation in such cases rather than renaming
> (which is easy to get subtly wrong). Remember that you can call any Ada
> operator as if it is a normal function. So:
>
> if Standard."=" (A, B) then

I tried this in
https://github.com/Blunk-electronic/ada_training/blob/master/src/redefining/equality_1/equality.adb
see line 99.

The compiler says:
equality.adb:99:20: incompatible arguments for operator



G.B.

unread,
Jun 25, 2022, 2:21:36 AMJun 25
to
That's the compiler telling you that TYPE_FLOAT is not
type Float, the type of arguments needed for Standard."="
(see above).

See Jeffrey Carter's response for what to do to make them
that.

Reply all
Reply to author
Forward
0 new messages