• overloading predefined operators

    From L. B.@21:1/5 to All on Fri Jun 24 01:10:57 2022
    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 ?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Dmitry A. Kazakov@21:1/5 to L. B. on Fri Jun 24 10:23:48 2022
    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;

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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From L. B.@21:1/5 to All on Fri Jun 24 02:44:43 2022
    Great. Thank you !!!

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Jeffrey R.Carter@21:1/5 to L. B. on Fri Jun 24 12:47:10 2022
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to Dmitry A. Kazakov on Fri Jun 24 22:18:37 2022
    "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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From L. B.@21:1/5 to All on Fri Jun 24 22:58:40 2022
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From G.B.@21:1/5 to L. B. on Sat Jun 25 08:21:33 2022
    On 25.06.22 07:58, L. B. wrote:
    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

    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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)