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=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII X-Google-Thread: 103376,4d972ac0c79198a5 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-05-15 18:08:01 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.uchicago.edu!newsfeed.cs.wisc.edu!144.212.100.101.MISMATCH!newsfeed!nntp.TheWorld.com!not-for-mail From: Robert A Duff Newsgroups: comp.lang.ada Subject: Re: Generic child units Date: 15 May 2003 21:08:00 -0400 Organization: The World Public Access UNIX, Brookline, MA Message-ID: References: <3ec12f93$1@epflnews.epfl.ch> <3ec1f6ab$1@epflnews.epfl.ch> NNTP-Posting-Host: shell01.theworld.com Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: pcls4.std.com 1053047281 12383 199.172.62.241 (16 May 2003 01:08:01 GMT) X-Complaints-To: abuse@TheWorld.com NNTP-Posting-Date: Fri, 16 May 2003 01:08:01 +0000 (UTC) User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 Xref: archiver1.google.com comp.lang.ada:37369 Date: 2003-05-15T21:08:00-04:00 List-Id: Rodrigo Garc�a writes: > Stephen Leake wrote: > > Rodrigo Garc�a writes: > > > >>I need some enlightment in this area... Let us suppose that I have two > >>generic packages declared in separate files and one is the parent of > >>the other: > >> > >>generic > >> type Elem is private; > >>package Parent is > >> type Vector is array (Integer range <>) of Elem; > >>end Parent; > >> > >>generic > >>package Parent.Child is > >> subtype Vector2D is Vector (1 .. 2); > >>end Parent.Child; > >> > >> How can I instantiate the child package > > with Parent.Child; > > procedure Foo is > > package Par is new Parent (Elem => Integer); > > package Chi is new Par.Child; > > begin > > ... > > end Foo; > > Note that the second instantiation is "Par.Child", not "Parent.Child". > > Thanks, that is one of the things I was doing wrong. > > >>within the declarative region of the parent package (as required by > >>RM 10.1(18))? > > There is no RM 10.1 (18), at least in the copy I have (came with > > GNAT). And I don't understand the rest of the sentence, either. So I > > don't know what you mean here. > > Sorry, I meant RM 10.1.1 (18) as David C. Hoos has remarked. I still > do not understand that requirement. Paragraph 19.b in the AARM explains it. You are instantiating the child *outside* the parent generic, so you want to instantiate the child of the instance of the parent, not the child of the parent. Make sense? Here's the AARM text: 18 A child of a parent generic package shall be instantiated or renamed only within the declarative region of the parent generic. 19 For each declaration or renaming of a generic unit as a child of some parent generic package, there is a corresponding declaration nested immediately within each instance of the parent. [This declaration is visible only within the scope of a with_clause that mentions the child generic unit.] 19.a Implementation Note: Within the child, like anything nested in a generic unit, one can make up-level references to the current instance of its parent, and thereby gain access to the formal parameters of the parent, to the types declared in the parent, etc. This ``nesting'' model applies even within the generic_formal_part of the child, as it does for a generic child of a nongeneric unit. 19.b Ramification: Suppose P is a generic library package, and P.C is a generic child of P. P.C can be instantiated inside the declarative region of P. Outside P, P.C can be mentioned only in a with_clause. Conceptually, an instance I of P is a package that has a nested generic unit called I.C. Mentioning P.C in a with_clause allows I.C to be instantiated. I need not be a library unit, and the instantiation of I.C need not be a library unit. If I is a library unit, and an instance of I.C is a child of I, then this instance has to be called something other than C. - Bob