comp.lang.ada
 help / color / mirror / Atom feed
From: mark_lundquist@my-deja.com
Subject: Re: generic formal object parameters of mode 'in out'
Date: 2000/11/06
Date: 2000-11-06T00:00:00+00:00	[thread overview]
Message-ID: <8u7evh$5ue$1@nnrp1.deja.com> (raw)
In-Reply-To: 3a06dc1c.259466533@news.rrds.co.uk

In article <3a06dc1c.259466533@news.rrds.co.uk>,
  steve.folly@rdel.co.uk (Steve Folly) wrote:

> In my program I have the following generic package...
>
> subtype Template_String is string(1..4);
>
> generic
>    type T is private;
>    Default : T;
>    Template : Template_String;
> package P
>    The_Template : constant String := Template;
>    .
>    .
> end P;
>
> We have had to declare The_Template because we've found that the
> parameters are not visible from an instantiation, ie.
>
> declare
>   package X is new P ( T => Integer, Default => 0, Template => "NNNN"
> );
> begin
>    Ada.Text_Io.Put_Line("The template is " & X.Template ); -- uh oh!
>    Ada.Text_Io.Put_Line("The template is " & X.The_Template ); -- OK
> end;
>
> Am I right in thinking that by making Template an 'in out', I don't
> need The_Template.

Nope, sorry.  Making Template 'in out' won't change its visibility.  If
you make Template 'in out', then you will get a compile error on your
instantiation above, because an 'in out' generic formal requires a
variable (view of an) object as the actual (because the generic is
allowed to change the value of the actual).  So instantiating it on a
constant expression like "NNNN" isn't legal.

But... I'd still get rid of The_Template, anyway!

Having P re-export one of its own generic parameters strikes me as
gimmiky and something that doesn't really make the program clearer.
Since, by construction, the actuals are visible wherever the
instantiation itself is visible, why not just refer to the actual?  You
don't need a workaround for not being able to refer to the formal.

That is:

   declare
      Template : constant String := "NNNN";
      package X is new P (T => Integer, Default => 0, Template =>
Template);
    begin
        Ada.Text_Io.Put_Line ("The template is " & Template);
    end;

To me that seems less roundabout... but to each his/her own...

> And, if it is now an 'in out', can I change Template at any time
> outside of the instantiation (or inside it) ?

Right.

have fun,
mark

Mark Lundquist
Rational Software



Sent via Deja.com http://www.deja.com/
Before you buy.




  reply	other threads:[~2000-11-06  0:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-11-06  0:00 generic formal object parameters of mode 'in out' Steve Folly
2000-11-06  0:00 ` mark_lundquist [this message]
2000-11-06  0:00 ` Robert A Duff
replies disabled

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