comp.lang.ada
 help / color / mirror / Atom feed
From: mab@wdl39.wdl.loral.com (Mark A Biggar)
Subject: Re: private types and recompilation
Date: 28 Jan 93 18:08:53 GMT	[thread overview]
Message-ID: <1993Jan28.180853.2008@wdl.loral.com> (raw)

In article <9301271722.aa25516@Paris.ics.uci.edu> kanderso@mabillon.ICS.UCI.EDU
 (Kenneth Anderson) writes:
>In comp.lang.ada you write:
>>When Ada 83 was designed, why did the designers choose to put
>>the details of private types in package specifications, rather than
>>in package bodies (which is more in the spirit of information hiding, and
>>better supports independent compilation).
>I'm not sure, but I think because the compiler needs to know the size
>of the types so that it can allocate space for parameters in the
>subprograms that are defined in the spec.
>>generic
>>  type ATOM is private;
>>package LIST_ADT is
>>  type POSITION is private;
>>  type LIST is private;
>>  procedure CREATE(L: in out LIST);
>>  procedure INSERT_AFTER(L: in out LIST; P: POSITION; A: ATOM);
>>  ...
>>private
>>  type LIST;
>>  type POSITION is access LIST;
>You only need the previous two lines.  The declaration below can be
>hidden in the body of the package.
>>  type LIST is record
>>    A: ATOM;
>>    NEXT: POSITION;
>>  end record;
>>end LIST_ADT;

Sorry but you can't do that because LIST is mentioned in the non-private
part of the package spec, its completing declaration must be included in the
private part.  It is only incomplete types that are first introduced in the 
private part that can be completed in the package body.  So if you wrote
the package like the following then you can push the completed type to the
body.  Besides the above package definition is clumsy anyway because the
abstraction for a linked list does not need both the node type and the access
to the node be externally visible.

generic
    type ATOM is private;
package LIST_ADT is
    type LIST is private;
    procedure CREATE(L: in out LIST);
    procedure INSERT(L: in out LIST, A: ATOM);
    ...
private
    type NODE;
    type LIST is access NODE;
end LIST_ADT;

package body LIST_ADT is
    ...
    type NODE is record
	A: ATOM;
	NEXT: LIST;
    end record;
    ...
end LIST_ADT;

Notice that the incomplete type NODE is only mentioned in the private part
of the spec so its completing declaration can wait until the package body.

--
Mark Biggar
mab@wdl1.wdl.lroal.com

             reply	other threads:[~1993-01-28 18:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1993-01-28 18:08 Mark A Biggar [this message]
  -- strict thread matches above, loose matches on Subject: below --
1993-01-28 23:44 private types and recompilation Alex Blakemore
1993-01-28 15:58 Pat Rogers
1993-01-28 15:25 Tucker Taft
1993-01-28 14:13 David Emery
1993-01-28  8:07 Christian S. Collberg
1993-01-28  1:22 Kenneth Anderson
1993-01-27 22:15 David Erickson
replies disabled

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