comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Rationale for this not to compile?
Date: Fri, 25 Jul 2014 00:29:03 -0500
Date: 2014-07-25T00:29:03-05:00	[thread overview]
Message-ID: <lqspuv$bih$1@loke.gir.dk> (raw)
In-Reply-To: 1cb91e6a-9e49-4bc8-bf4a-67a16a00e3a0@googlegroups.com


"Adam Beneschan" <adambeneschan@gmail.com> wrote in message 
news:1cb91e6a-9e49-4bc8-bf4a-67a16a00e3a0@googlegroups.com...
>On Thursday, July 24, 2014 1:53:32 PM UTC-7, Victor Porton wrote:
>> Is there any rationale why this does not compile?
>
>A generic instantiation is equivalent to "the instance declaration ... 
>immediately followed
>by the instance body, both at the place of the instantiation."  (12.3(12)) 
>Since the body
>could contain code that depends on the representation of X already being 
>determined,
>but it hasn't yet, the language makes this illegal.  At least I think 
>that's the rationale.
>AARM section 13.14, which discusses the freezing rules, explains in more 
>detail why
>types have to be completely defined before they're used in certain cases 
>(see
> http://www.ada-auth.org/standards/12aarm/html/AA-13-14.html).

That's a pretty good explanation.

We (the ARG) have spent dozens of hours attempting to find a way to allow 
something like the OPs example. (There's something like 10 AIs associated 
with that.) Each solution had some sort of fatal flaw (implementability, 
maintenance problems, too hard to use, etc.)

The best solution is the put the instance into a child package; one of the 
reasons that we didn't adopt any of the ugly solutions is that using a child 
package often works fine and an ugly solution doesn't seem worth it in that 
case.

In the special case where the generic has little implementation of it's own 
(a signature package), one can use a formal incomplete type as the formal 
type; it does allow an instantiation like the one the OP wrote. 
Specifically:

package OK_Test is

   generic
      type T;
   package Gen is
   end Gen;

   type X is private;

   package Instance is new Gen(X);

private

   type X is null record;

end OK_Test;

is legal. But the use of the formal incomplete type strongly restricts what 
you can do in the generic unit (because it's an incomplete type, and those 
allow very limited uses).

One of my pet projects (that I don't have any time to follow up on!) is to 
create a useful container where the element type is a formal incomplete 
type. I think that the container would have to manage elements that live 
elsewhere (unlike Ada.Containers) -- since element creation isn't possible, 
but this would allow a container of limited elements, and of course would 
allow instantiation by a private type as here.

                                          Randy.






> If it compiled, it would
> be probably useful in practice with a real example similar to the below 
> toy
> example (as to make the type T not private, I must create an *.Internal.*
> package to serve as a "private repository" for types like T, as real 
> private
> types cannot be used). It is called a hack.
>
> gnatmake -q -c -gnatc -u -P/home/porton/t/default.gpr test.ads
> test.ads:10:32: premature use of private type
> gnatmake: "/home/porton/t/test.ads" compilation error
>
> package Test is
>
>    generic
>       type T is limited private;
>    package Gen is
>    end Gen;
>
>    type X is private;
>
>    package Instance is new Gen(X);
>
> private
>    type X is null record;
> end Test; 




  reply	other threads:[~2014-07-25  5:29 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-24 20:53 Rationale for this not to compile? Victor Porton
2014-07-24 21:36 ` Adam Beneschan
2014-07-25  5:29   ` Randy Brukardt [this message]
2014-07-25 12:19     ` Victor Porton
2014-07-25 12:35       ` AdaMagica
2014-07-25 14:40     ` Robert A Duff
2014-07-25 19:45       ` Randy Brukardt
2014-07-25 20:33         ` Robert A Duff
2014-07-25 13:18 ` Victor Porton
replies disabled

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