comp.lang.ada
 help / color / mirror / Atom feed
From: Dale Stanbrough <dstanbro@bigpond.net.au>
Subject: Re: Visibility of private packages??
Date: Wed, 31 Jul 2002 12:06:39 GMT
Date: 2002-07-31T12:06:39+00:00	[thread overview]
Message-ID: <dstanbro-8DD764.22063931072002@news-server.bigpond.net.au> (raw)
In-Reply-To: 3d47a99e.4548109@news.demon.co.uk

Peter.Coventry@gdcanada.com wrote:
> 
> >I am trying to get my head around the visibility rules applicable to private
> >packages.
> >
> >If I have the following package hierarchy:
> >
> >           A
> >        /      \
> >     A.B1   A.B2
> >    /
> > A.B1.C1
> >
> >A.B1 contains the interface that I wish to export to clients (i.e a type
> >plus routines for client manipulation).
> >A.B1.C1 contains additional routines for the type not meant for client use.
> >A.B2 contains some inner workings, that need to use the additional routines
> >in A.B1.C1.
> >
> >I want to make A.B1.C1 a private package to stop it from being misused by
> >clients, however the compiler disallows it, citing RM 10.1.2(8):
> >
> >" If a with_clause of a given compilation_unit mentions a private child of
> >some library unit, then the given compilation_unit shall be either the
> >declaration of a private descendant of that library unit or the body or
> >subunit of a (public or private) descendant of that library unit."
> >
> >Does this mean that if A.B1.C1 is private, it can only be withed by the
> >bodies of A.B1 and other descendants of A.B1, and specs of private packages
> >of descendants of A.B1?

Yes, that's correct. I think this is a case where the designers got it
wrong. The current rules prevent "compilation coupling", that is any
change to a private package will never result in the need to recompile
a package outside of the hierachy.

A laudible aim, but too restrictive IMHO. It would have been better 
to simply restrict the use of types defined in a private spec to
either the private part of a package spec, or the package body.
This would allow you to, for example, complete a private type 
declaration with a type derived from a private package, or a 
structure with a private component.

E.g.

   private package a.b is
      type hidden is <something>
   end a.b;

   with a.b;
   package a.c is
      type not_hidden is private;
   private
      type not_hidden is new a.b.hidden;
   end;

The change could be made, and it would not be incompatable with
existing programs.

Dale



  reply	other threads:[~2002-07-31 12:06 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-30 21:23 Visibility of private packages?? Peter Coventry
2002-07-31  9:13 ` John McCabe
2002-07-31 12:06   ` Dale Stanbrough [this message]
2002-07-31 13:30     ` Robert A Duff
2002-08-14  1:16       ` Randy Brukardt
2002-08-14  9:53         ` Dale Stanbrough
2002-08-14 17:03           ` Robert Dewar
2002-08-14 19:42           ` Randy Brukardt
2002-07-31 11:55 ` Jean-Pierre Rosen
2002-07-31 13:22 ` Mark Doherty
2002-07-31 17:43 ` Anh_Vo
replies disabled

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