1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Package Specifications and Declarations</TITLE>
<META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
<META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
<STYLE type="text/css">
DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
TT {font-family: "Courier New", monospace}
DT {display: compact}
DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Index {font-family: "Times New Roman", Times, serif}
DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left: 10.0em; margin-bottom: 0.6em}
DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 15.0em; margin-bottom: 0.6em}
UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
DD.Hanging {margin-left: 6.0em}
DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.IndentedHanging {margin-left: 2.0em}
DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.HangingInBulleted {margin-left: 4.0em}
DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallHanging {margin-left: 7.5em}
DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallIndentedHanging {margin-left: 2.0em}
DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallHangingInBulleted {margin-left: 5.0em}
DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.Enumerated {margin-left: 2.0em}
DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallEnumerated {margin-left: 2.5em}
DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
</STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7.html">Previous</A> <A HREF="AA-7-2.html">Next</A></P>
<HR>
<H1> 7.1 Package Specifications and Declarations</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [A package is generally provided in two parts:
a <FONT FACE="Arial, Helvetica">package_specification</FONT> and a <FONT FACE="Arial, Helvetica">package_body</FONT>.
Every package has a <FONT FACE="Arial, Helvetica">package_specification</FONT>,
but not all packages have a <FONT FACE="Arial, Helvetica">package_body</FONT>.]
</DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">package_declaration<A NAME="I3191"></A>
::= </FONT><A NAME="I3192"></A><FONT FACE="Arial, Helvetica">package_specification</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">package_specification<A NAME="I3193"></A>
::= </FONT><BR>
<B>package</B> <A NAME="I3194"></A><FONT FACE="Arial, Helvetica">defining_program_unit_name</FONT> <B>is</B><BR>
{<A NAME="I3195"></A><FONT FACE="Arial, Helvetica">basic_declarative_item</FONT>}<BR>
[<B>private</B><BR>
{<A NAME="I3196"></A><FONT FACE="Arial, Helvetica">basic_declarative_item</FONT>}]<BR>
<B>end</B> [[<A NAME="I3197"></A><FONT FACE="Arial, Helvetica">parent_unit_name</FONT>.]<A NAME="I3198"></A><FONT FACE="Arial, Helvetica">identifier</FONT>]</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented">If an <FONT FACE="Arial, Helvetica">identifier</FONT>
or <FONT FACE="Arial, Helvetica">parent_unit_name</FONT>.<FONT FACE="Arial, Helvetica">identifier</FONT>
appears at the end of a <FONT FACE="Arial, Helvetica">package_specification</FONT>,
then this sequence of lexical elements shall repeat the <FONT FACE="Arial, Helvetica">defining_program_unit_name</FONT>.
</DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3199"></A><A NAME="I3200"></A>A <FONT FACE="Arial, Helvetica">package_declaration</FONT>
or <FONT FACE="Arial, Helvetica">generic_package_declaration</FONT> requires
a completion [(a body)] if it contains any <FONT FACE="Arial, Helvetica">declarative_item</FONT>
that requires a completion, but whose completion is not in its <FONT FACE="Arial, Helvetica">package_specification</FONT>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B>If an implementation
supports it, a <FONT FACE="Arial, Helvetica">pragma</FONT> Import may
substitute for the body of a package or generic package. </FONT></DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3201"></A>The first list of <FONT FACE="Arial, Helvetica">declarative_item</FONT>s
of a <FONT FACE="Arial, Helvetica">package_specification</FONT> of a
package other than a generic formal package is called the <I>visible
part</I> of the package. [<A NAME="I3202"></A> The optional list of <FONT FACE="Arial, Helvetica">declarative_item</FONT>s
after the reserved word <B>private</B> (of any <FONT FACE="Arial, Helvetica">package_specification</FONT>)
is called the <I>private part</I> of the package. If the reserved word
<B>private</B> does not appear, the package has an implicit empty private
part.] </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This definition
of visible part does not apply to generic formal packages -- <A HREF="AA-12-7.html">12.7</A>
defines the visible part of a generic formal package.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The implicit empty private part
is important because certain implicit declarations occur there if the
package is a child package, and it defines types in its visible part
that are derived from, or contain as components, private types declared
within the parent package. These implicit declarations are visible in
children of the child package. See <A HREF="AA-10-1-1.html">10.1.1</A>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> [An entity declared in the private part of a package
is visible only within the declarative region of the package itself (including
any child units -- see <A HREF="AA-10-1-1.html">10.1.1</A>). In contrast,
expanded names denoting entities declared in the visible part can be
used even outside the package; furthermore, direct visibility of such
entities can be achieved by means of <FONT FACE="Arial, Helvetica">use_clause</FONT>s
(see <A HREF="AA-4-1-3.html">4.1.3</A> and <A HREF="AA-8-4.html">8.4</A>).]
</DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3203"></A>The elaboration of a <FONT FACE="Arial, Helvetica">package_declaration</FONT>
consists of the elaboration of its <FONT FACE="Arial, Helvetica">basic_declarative_item</FONT>s
in the given order. </DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>1 The visible part of a package
contains all the information that another program unit is able to know
about the package.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>2 If a declaration occurs
immediately within the specification of a package, and the declaration
has a corresponding completion that is a body, then that body has to
occur immediately within the body of the package. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Proof: </B>This follows from
the fact that the declaration and completion are required to occur immediately
within the same declarative region, and the fact that <FONT FACE="Arial, Helvetica">bodies</FONT>
are disallowed (by the Syntax Rules) in <FONT FACE="Arial, Helvetica">package_specification</FONT>s.
This does not apply to instances of generic units, whose bodies can occur
in <FONT FACE="Arial, Helvetica">package_specification</FONT>s. </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Example of a
package declaration:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B> Rational_Numbers <B>is</B></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT> <B>type</B> Rational <B>is</B><BR>
<B>record</B><BR>
Numerator : Integer;<BR>
Denominator : Positive;<BR>
<B>end</B> <B>record</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Examples"><TT> <B>function</B> "="(X,Y : Rational) <B>return</B> Boolean;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT> <B>function</B> "/" (X,Y : Integer) <B>return</B> Rational; --<I> to construct a rational number</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Examples"><TT> <B>function</B> "+" (X,Y : Rational) <B>return</B> Rational;<BR>
<B>function</B> "-" (X,Y : Rational) <B>return</B> Rational;<BR>
<B>function</B> "*" (X,Y : Rational) <B>return</B> Rational;<BR>
<B>function</B> "/" (X,Y : Rational) <B>return</B> Rational;<BR>
<B>end</B> Rational_Numbers;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal"> There are also many examples of package declarations
in the predefined language environment (see <A HREF="AA-A.html">Annex
A</A>). </DIV>
<H4 ALIGN=CENTER>Incompatibilities With Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I3204"></A>In Ada 83,
a library package is allowed to have a body even if it doesn't need one.
In Ada 95, a library package body is either required or forbidden --
never optional. The workaround is to add <B>pragma</B> Elaborate_Body,
or something else requiring a body, to each library package that has
a body that isn't otherwise required. </FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We have moved the syntax into
this clause and the next clause from RM83-7.1, ``Package Structure'',
which we have removed.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>RM83 was unclear on the rules
about when a package requires a body. For example, RM83-7.1(4) and RM83-7.1(8)
clearly forgot about the case of an incomplete type declared in a <FONT FACE="Arial, Helvetica">package_declaration</FONT>
but completed in the body. In addition, RM83 forgot to make this rule
apply to a generic package. We have corrected these rules. Finally, since
we now allow a <FONT FACE="Arial, Helvetica">pragma</FONT> Import for
any explicit declaration, the completion rules need to take this into
account as well. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7.html">Previous</A> <A HREF="AA-7-2.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|