comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen.a.leake.1@gsfc.nasa.gov>
Subject: Re: Dispatching and generics - language lawyer question
Date: 24 Jul 2002 11:37:14 -0400
Date: 2002-07-24T15:46:01+00:00	[thread overview]
Message-ID: <u1y9ti1cl.fsf@gsfc.nasa.gov> (raw)
In-Reply-To: ud6te30y5.fsf@gsfc.nasa.gov

Stephen Leake <stephen.a.leake.1@gsfc.nasa.gov> writes:

> There is a problem with "reemergence" of predefined operators for
> generic formal types, but I don't have an example of when it occurs. I
> didn't see a discussion of this in Cohen's "Ada as a Second Language",
> either. Nor in the Rationale. But maybe I just didn't look hard
> enough.

Based on a hint from Christoph Grein, I wrote the following code to
demonstrate the "reemergence problem". It occurs for non-tagged types;
for tagged types, Ada 95 fixed the problem.

 
with Ada.Text_IO; use Ada.Text_IO;
procedure Reemerge
is
   type X is new Integer;
   function "=" (L, R: X) return Boolean;  -- redefine

   function "=" (L, R: X) return Boolean
   is begin
      Put_Line ("in redefined ""="" (X)");
      return Integer (L + R) = 0;
   end "=";

begin
Type_Compose :
    declare
       type Y is record
          C : X;
       end record;

       A : Y := (C => 1);
       B : Y := (C => 1);
    begin
       Put_Line ("Type_Compose");
       Put_Line ("A = B => " & Boolean'Image (A = B));
       -- Here predefined "=" on component C is used, not the
       -- equality redefined above

       New_Line;
       Put_Line ("A.C = B.C => " & Boolean'Image (A.C = B.C));
       -- Here the equality redefined above is used.
    end Type_Compose;

    New_Line;

Generic_Reemerge:
    declare

       generic
          type T is private;
       procedure Compare (L, R : in T);
       -- Print a message with the result of "=" (L, R).

       procedure Compare (L, R : in T)
       is begin
          Put_Line ("L = R => " & Boolean'Image (L = R));
       end Compare;

       procedure Compare_X is new Compare (X);

    begin
       Put_Line ("Generic_Reemerge");
       Compare_X (1, 1);
    end Generic_Reemerge;

    New_Line;
Generic_Correct:
    declare

       generic
          type T is private;
          with function "=" (L, R : in T) return Boolean is <>;
       procedure Compare (L, R : in T);
       -- Print a message with the result of "=" (L, R).

       procedure Compare (L, R : in T)
       is begin
          Put_Line ("L = R => " & Boolean'Image (L = R));
       end Compare;

       procedure Compare_X is new Compare (X);

    begin
       Put_Line ("Generic_Correct");
       Compare_X (1, 1);
    end Generic_Correct;

    New_Line;
Generic_Tagged:
    declare

       package Tagged_Type is
          type Y is tagged record
             Z : Integer;
          end record;

          function "=" (L, R : in Y) return Boolean;
       end Tagged_Type;

       package body Tagged_Type is

          function "=" (L, R : in Y) return Boolean
          is begin
             return L.Z + R.Z = 0;
          end "=";
       end Tagged_Type;

       generic
          type T is private;
       procedure Compare (L, R : in T);
       -- Print a message with the result of "=" (L, R).

       procedure Compare (L, R : in T)
       is begin
          Put_Line ("L = R => " & Boolean'Image (L = R));
       end Compare;

       procedure Compare_Y is new Compare (Tagged_Type.Y);

    begin
       Put_Line ("Generic_Tagged");
       Compare_Y ((Z => 1), (Z => 1));
    end Generic_Tagged;

end Reemerge;

-- 
-- Stephe



  reply	other threads:[~2002-07-24 15:37 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-22 23:13 Dispatching and generics - language lawyer question Adam Beneschan
2002-07-23 15:42 ` Stephen Leake
2002-07-24 15:37   ` Stephen Leake [this message]
  -- strict thread matches above, loose matches on Subject: below --
2002-07-24  5:33 Grein, Christoph
2002-07-24 22:55 ` Robert A Duff
2002-07-25 15:46   ` Ben Brosgol
2002-07-29 20:38     ` Robert A Duff
2002-07-31 22:52       ` Dmitry A.Kazakov
2002-07-31 20:18         ` Robert A Duff
2002-08-02  1:15           ` Dmitry A.Kazakov
2002-08-01 16:30             ` Hyman Rosen
2002-08-02 23:42               ` Dmitry A.Kazakov
2002-08-02 15:49                 ` Hyman Rosen
2002-08-02 17:48                   ` Stephen Leake
2002-08-10  3:03                     ` Warren W. Gay VE3WWG
2002-08-05 11:15                   ` Dmitry A. Kazakov
2002-08-12 12:44                   ` Robert Dewar
2002-08-13 22:50           ` Randy Brukardt
2002-08-14  0:02             ` Robert A Duff
2002-07-25  0:40 ` Robert Dewar
replies disabled

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