From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: Simon Wright Newsgroups: comp.lang.ada Subject: Re: package organization (is this doable?) Date: Fri, 29 Jun 2018 20:37:49 +0100 Organization: A noiseless patient Spider Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain Injection-Info: reader02.eternal-september.org; posting-host="74d0eacff1120e85df1edb6f3f06b6d4"; logging-data="8018"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18v0CsXavfjgcZVr/Sfu0s8KKmq8HA1tRA=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (darwin) Cancel-Lock: sha1:Bv7Nes8u7LI3NrZkTJcUPGlaAbA= sha1:KqyPG9XS2rhygRYr7QAvp7UGTBE= Xref: reader02.eternal-september.org comp.lang.ada:53439 Date: 2018-06-29T20:37:49+01:00 List-Id: "Alejandro R. Mosteo" writes: > On 29/06/2018 18:34, Simon Wright wrote: >> "Alejandro R. Mosteo" 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;