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
next prev parent 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