comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: overloading predefined operators
Date: Fri, 24 Jun 2022 22:18:37 -0500	[thread overview]
Message-ID: <t95uqf$fu9$1@dont-email.me> (raw)
In-Reply-To: t93sak$10r4$1@gioia.aioe.org

"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message 
news:t93sak$10r4$1@gioia.aioe.org...
> On 2022-06-24 10:10, L. B. wrote:
>> 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 ?
>
> 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;

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.


  parent reply	other threads:[~2022-06-25  3:18 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1fabca7a-e3f0-41bb-9b51-9eabde85e800n@googlegroups.com>
2022-06-24  8:23 ` overloading predefined operators Dmitry A. Kazakov
2022-06-24  9:44   ` L. B.
2022-06-25  3:18   ` Randy Brukardt [this message]
2022-06-25  5:58     ` L. B.
2022-06-25  6:21       ` G.B.
2022-06-24 10:47 ` Jeffrey R.Carter
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox