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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Ada95 - 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="RM-TOC.html">Contents</A> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-7-1.html">Previous</A> <A HREF="RM-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="I3066"></A>
::= </FONT><BR>
<B>package</B> <B>body</B> <A NAME="I3067"></A><FONT FACE="Arial, Helvetica">defining_program_unit_name</FONT> <B>is</B><BR>
<A NAME="I3068"></A><FONT FACE="Arial, Helvetica">declarative_part</FONT><BR>
[<B>begin</B><BR>
<A NAME="I3069"></A><FONT FACE="Arial, Helvetica">handled_sequence_of_statements</FONT>]<BR>
<B>end</B> [[<A NAME="I3070"></A><FONT FACE="Arial, Helvetica">parent_unit_name</FONT>.]<A NAME="I3071"></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="RM-10-2-1.html">10.2.1</A>) if it would
not otherwise require one. </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="I3072"></A>(For an instance, the implicit <FONT FACE="Arial, Helvetica">package_body</FONT>
occurs at the place of the instantiation (see <A HREF="RM-12-3.html">12.3</A>).
For a library package, the place is partially determined by the elaboration
dependences (see Section 10).) </DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3073"></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="RM-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="RM-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>
<HR>
<P><A HREF="RM-TOC.html">Contents</A> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-7-1.html">Previous</A> <A HREF="RM-7-3.html">Next</A> <A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>
|