comp.lang.ada
 help / color / mirror / Atom feed
From: Simon Wright <simon@pushface.org>
Subject: Re: package organization (is this doable?)
Date: Fri, 29 Jun 2018 20:37:49 +0100
Date: 2018-06-29T20:37:49+01:00	[thread overview]
Message-ID: <ly6021tmcy.fsf@pushface.org> (raw)
In-Reply-To: ph5usm$n62$1@dont-email.me

"Alejandro R. Mosteo" <alejandro@mosteo.com> writes:

> On 29/06/2018 18:34, Simon Wright wrote:
>> "Alejandro R. Mosteo" <alejandro@mosteo.com> writes:
>>
>>> package Lib; -- Root package
>>>
>>> package Lib.Feat_1; -- Some feature
>>>
>>> package Lib.Feat_2; -- Another feature
>>>
>>> private package Lib.Impl; -- Things I want to keep secret,
>>> conceptually they're in the private part of Lib IIUC.
>>>
>>> Am I right that it is impossible for Feat_1 and Feat_2 to communicate
>>> using something that's private in Lib or Lib.Impl? That would mean
>>> exposing those private types in their respective public parts, which
>>> is a no go.
>>
>> Lib.Feat_1 & 2 can see the private part of Lib, and the public part of
>> Lib.Impl.
>>
>> What's wrong with putting stuff in the public part of Lib.Impl? No one
>> outside Lib can see it.
>
> in Lib.Feat_1, doing a "with Lib.Impl" results in error
> "current unit must also be private descendant of Lib".

In the spec, yes (or, as you say, 'with private', but of course you
can't make anything in the public part of Feat_1 (which is visible to
clients) depend on the private package Impl.

> I can do (in Feat_1) a "private with Lib.Impl", but then I can use
> these things only in private parts/body of Lib.Feat_1, which are also
> out of bounds for Lib.Feat_2, and viceversa.

'with Lib.Impl;' needs to be on Feat_*'s _body_.

So, put whatever you need Feat_1 to communicate to Feat_2 in Lib's
private part or Impl's public part (remember, it's only public to Lib's
body and Feat_*'s bodies.

package Lib is
private
   J : Integer := 42;
end Lib;

package Lib.Feat_1 with Elaborate_Body is
end Lib.Feat_1;

package Lib.Feat_2 with Elaborate_Body is
end Lib.Feat_2;

private package Lib.Impl is
   K : Integer := 41;
end Lib.Impl;

with Lib.Impl;
package body Lib.Feat_1 is
   A : Integer := J;
   U : Integer := Impl.K;
end Lib.Feat_1;

with Lib.Impl;
package body Lib.Feat_2 is
   B : Integer := J;
   V : Integer := Impl.K;
end Lib.Feat_2;

  reply	other threads:[~2018-06-29 19:37 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-29 15:45 package organization (is this doable?) Alejandro R. Mosteo
2018-06-29 16:34 ` Simon Wright
2018-06-29 18:47   ` Alejandro R. Mosteo
2018-06-29 19:37     ` Simon Wright [this message]
2018-07-02  8:23       ` Alejandro R. Mosteo
replies disabled

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