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 211 212 213 214 215 216 217 218 219 220 221 222 223 224
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Package Bodies</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-1.html">Previous</A> <A HREF="AA-7-3.html">Next</A></P>
<HR>
<H1> 7.2 Package Bodies</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [In contrast to the entities declared in the visible
part of a package, the entities declared in the <FONT FACE="Arial, Helvetica">package_body</FONT>
are visible only within the <FONT FACE="Arial, Helvetica">package_body</FONT>
itself. As a consequence, a package with a <FONT FACE="Arial, Helvetica">package_body</FONT>
can be used for the construction of a group of related subprograms in
which the logical operations available to clients are clearly isolated
from the internal entities.] </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">package_body<A NAME="I3205"></A>
::= </FONT><BR>
<B>package</B> <B>body</B> <A NAME="I3206"></A><FONT FACE="Arial, Helvetica">defining_program_unit_name</FONT> <B>is</B><BR>
<A NAME="I3207"></A><FONT FACE="Arial, Helvetica">declarative_part</FONT><BR>
[<B>begin</B><BR>
<A NAME="I3208"></A><FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>]<BR>
<B>end</B> [[<A NAME="I3209"></A><FONT FACE="Arial, Helvetica">parent_unit_name</FONT>.]<A NAME="I3210"></A><FONT FACE="Arial, Helvetica">identifier</FONT>];</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</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_body</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>4</FONT></DIV>
<DIV Class="Normal"> A <FONT FACE="Arial, Helvetica">package_body</FONT>
shall be the completion of a previous <FONT FACE="Arial, Helvetica">package_declaration</FONT>
or <FONT FACE="Arial, Helvetica">generic_package_declaration</FONT>.
A library <FONT FACE="Arial, Helvetica">package_declaration</FONT> or
library <FONT FACE="Arial, Helvetica">generic_package_declaration</FONT>
shall not have a body unless it requires a body[; <B>pragma</B> Elaborate_Body
can be used to require a <FONT FACE="Arial, Helvetica">library_unit_declaration</FONT>
to have a body (see <A HREF="AA-10-2-1.html">10.2.1</A>) if it would
not otherwise require one]. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The first
part of the rule forbids a <FONT FACE="Arial, Helvetica">package_body</FONT>
from standing alone -- it has to belong to some previous <FONT FACE="Arial, Helvetica">package_declaration</FONT>
or <FONT FACE="Arial, Helvetica">generic_package_declaration</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>A nonlibrary <FONT FACE="Arial, Helvetica">package_declaration</FONT>
or nonlibrary <FONT FACE="Arial, Helvetica">generic_package_declaration</FONT>
that does not require a completion may have a corresponding body anyway.
</FONT></DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> In any <FONT FACE="Arial, Helvetica">package_body</FONT>
without <FONT FACE="Arial, Helvetica">statement</FONT>s there is an implicit
<FONT FACE="Arial, Helvetica">null_statement</FONT>. For any <FONT FACE="Arial, Helvetica">package_declaration</FONT>
without an explicit completion, there is an implicit <FONT FACE="Arial, Helvetica">package_body</FONT>
containing a single <FONT FACE="Arial, Helvetica">null_statement</FONT>.
For a noninstance, nonlibrary package, this body occurs at the end of
the <FONT FACE="Arial, Helvetica">declarative_part</FONT> of the innermost
enclosing program unit or <FONT FACE="Arial, Helvetica">block_statement</FONT>;
if there are several such packages, the order of the implicit <FONT FACE="Arial, Helvetica">package_bodies</FONT>
is unspecified. <A NAME="I3211"></A>[(For an instance, the implicit <FONT FACE="Arial, Helvetica">package_body</FONT>
occurs at the place of the instantiation (see <A HREF="AA-12-3.html">12.3</A>).
For a library package, the place is partially determined by the elaboration
dependences (see Section 10).)] </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>Thus, for example,
we can refer to something happening just after the <B>begin</B> of a
<FONT FACE="Arial, Helvetica">package_body</FONT>, and we can refer to
the <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
of a <FONT FACE="Arial, Helvetica">package_body</FONT>, without worrying
about all the optional pieces. The place of the implicit body makes a
difference for tasks activated by the package. See also RM83-9.3(5).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The implicit body would be illegal
if explicit in the case of a library package that does not require (and
therefore does not allow) a body. This is a bit strange, but not harmful.
</FONT></DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3212"></A>For the elaboration of a nongeneric
<FONT FACE="Arial, Helvetica">package_body</FONT>, its <FONT FACE="Arial, Helvetica">declarative_part</FONT>
is first elaborated, and its <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>
is then executed. </DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>3 A variable declared in
the body of a package is only visible within this body and, consequently,
its value can only be changed within the <FONT FACE="Arial, Helvetica">package_body</FONT>.
In the absence of local tasks, the value of such a variable remains unchanged
between calls issued from outside the package to subprograms declared
in the visible part. The properties of such a variable are similar to
those of a ``static'' variable of C.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>4 The elaboration of the
body of a subprogram explicitly declared in the visible part of a package
is caused by the elaboration of the body of the package. Hence a call
of such a subprogram by an outside program unit raises the exception
Program_Error if the call takes place before the elaboration of the <FONT FACE="Arial, Helvetica">package_body</FONT>
(see <A HREF="AA-3-11.html">3.11</A>). </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Example of a
package body (see <A HREF="AA-7-1.html">7.1</A>):</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Examples"><TT><B>package</B> <B>body</B> Rational_Numbers <B>is</B></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Examples"><TT> <B>procedure</B> Same_Denominator (X,Y : <B>in</B> <B>out</B> Rational) <B>is</B><BR>
<B>begin</B><BR>
--<I> reduces X and Y to the same denominator:</I><BR>
...<BR>
<B>end</B> Same_Denominator;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Examples"><TT> <B>function</B> "="(X,Y : Rational) <B>return</B> Boolean <B>is</B><BR>
U : Rational := X;<BR>
V : Rational := Y;<BR>
<B>begin</B><BR>
Same_Denominator (U,V);<BR>
<B>return</B> U.Numerator = V.Numerator;<BR>
<B>end</B> "=";</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT> <B>function</B> "/" (X,Y : Integer) <B>return</B> Rational <B>is</B><BR>
<B>begin</B><BR>
<B>if</B> Y > 0 <B>then</B><BR>
<B>return</B> (Numerator => X, Denominator => Y);<BR>
<B>else</B><BR>
<B>return</B> (Numerator => -X, Denominator => -Y);<BR>
<B>end</B> <B>if</B>;<BR>
<B>end</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> Rational <B>is</B> ... <B>end</B> "+";<BR>
<B>function</B> "-" (X,Y : Rational) <B>return</B> Rational <B>is</B> ... <B>end</B> "-";<BR>
<B>function</B> "*" (X,Y : Rational) <B>return</B> Rational <B>is</B> ... <B>end</B> "*";<BR>
<B>function</B> "/" (X,Y : Rational) <B>return</B> Rational <B>is</B> ... <B>end</B> "/";</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT><B>end</B> Rational_Numbers;</TT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The syntax rule for <FONT FACE="Arial, Helvetica">package_body</FONT>
now uses the syntactic category <FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The <FONT FACE="Arial, Helvetica">declarative_part</FONT>
of a <FONT FACE="Arial, Helvetica">package_body</FONT> is now required;
that doesn't make any real difference, since a <FONT FACE="Arial, Helvetica">declarative_part</FONT>
can be empty.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>RM83 seems to have forgotten to
say that a <FONT FACE="Arial, Helvetica">package_body</FONT> can't stand
alone, without a previous declaration. We state that rule here.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>RM83 forgot to restrict the definition
of elaboration of <FONT FACE="Arial, Helvetica">package_bodies</FONT>
to nongeneric ones. We have corrected that omission.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.e</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The rule about implicit bodies
(from RM83-9.3(5)) is moved here, since it is more generally applicable.
</FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7-1.html">Previous</A> <A HREF="AA-7-3.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|