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 225 226 227 228 229 230 231 232 233 234
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Generic 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-12.html">Previous</A> <A HREF="AA-12-2.html">Next</A></P>
<HR>
<H1> 12.1 Generic Declarations</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [A <FONT FACE="Arial, Helvetica">generic_declaration</FONT>
declares a generic unit, which is either a generic subprogram or a generic
package. A <FONT FACE="Arial, Helvetica">generic_declaration</FONT> includes
a <FONT FACE="Arial, Helvetica">generic_formal_part</FONT> declaring
any generic formal parameters. A generic formal parameter can be an object;
alternatively (unlike a parameter of a subprogram), it can be a type,
a subprogram, or a package.] </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">generic_declaration<A NAME="I4160"></A>
::= </FONT><A NAME="I4161"></A><FONT FACE="Arial, Helvetica">generic_subprogram_declaration</FONT> | <A NAME="I4162"></A><FONT FACE="Arial, Helvetica">generic_package_declaration</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">generic_subprogram_declaration<A NAME="I4163"></A>
::= </FONT><BR>
<A NAME="I4164"></A><FONT FACE="Arial, Helvetica">generic_formal_part</FONT> <A NAME="I4165"></A><FONT FACE="Arial, Helvetica">subprogram_specification</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">generic_package_declaration<A NAME="I4166"></A>
::= </FONT><BR>
<A NAME="I4167"></A><FONT FACE="Arial, Helvetica">generic_formal_part</FONT> <A NAME="I4168"></A><FONT FACE="Arial, Helvetica">package_specification</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">generic_formal_part<A NAME="I4169"></A>
::= </FONT><B>generic</B> {<A NAME="I4170"></A><FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT> | <A NAME="I4171"></A><FONT FACE="Arial, Helvetica">use_clause</FONT>}</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration<A NAME="I4172"></A>
::= </FONT><BR>
<A NAME="I4173"></A><FONT FACE="Arial, Helvetica">formal_object_declaration</FONT><BR>
| <A NAME="I4174"></A><FONT FACE="Arial, Helvetica">formal_type_declaration</FONT><BR>
| <A NAME="I4175"></A><FONT FACE="Arial, Helvetica">formal_subprogram_declaration</FONT><BR>
| <A NAME="I4176"></A><FONT FACE="Arial, Helvetica">formal_package_declaration</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="SyntaxIndented">The only form of <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
allowed within a <FONT FACE="Arial, Helvetica">generic_formal_part</FONT>
is a <FONT FACE="Arial, Helvetica">subtype_mark</FONT> [(that is, the
<FONT FACE="Arial, Helvetica">subtype_indication</FONT> shall not include
an explicit <FONT FACE="Arial, Helvetica">constraint</FONT>)]. The defining
name of a generic subprogram shall be an <FONT FACE="Arial, Helvetica">identifier</FONT>
[(not an <FONT FACE="Arial, Helvetica">operator_symbol</FONT>)]. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>The reason for
forbidding <FONT FACE="Arial, Helvetica">constraint</FONT>s in <FONT FACE="Arial, Helvetica">subtype_indication</FONT>s
is that it simplifies the elaboration of <FONT FACE="Arial, Helvetica">generic_declaration</FONT>s
(since there is nothing to evaluate), and that it simplifies the matching
rules, and makes them more checkable at compile time. </FONT></DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> <A NAME="I4177"></A><A NAME="I4178"></A><A NAME="I4179"></A><A NAME="I4180"></A>A
<FONT FACE="Arial, Helvetica">generic_declaration</FONT> declares a generic
unit -- a generic package, generic procedure or generic function, as
appropriate.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> <A NAME="I4181"></A>An entity is a <I>generic
formal</I> entity if it is declared by a <FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT>.
``Generic formal,'' or simply ``formal,'' is used as a prefix in referring
to objects, subtypes (and types), functions, procedures and packages,
that are generic formal entities, as well as to their respective declarations.
[Examples: ``generic formal procedure'' or a ``formal integer type declaration.'']
</DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal"> <A NAME="I4182"></A>The elaboration of a <FONT FACE="Arial, Helvetica">generic_declaration</FONT>
has no effect. </DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>1 Outside a generic unit
a <FONT FACE="Arial, Helvetica">name</FONT> that denotes the <FONT FACE="Arial, Helvetica">generic_declaration</FONT>
denotes the generic unit. In contrast, within the declarative region
of the generic unit, a <FONT FACE="Arial, Helvetica">name</FONT> that
denotes the <FONT FACE="Arial, Helvetica">generic_declaration</FONT>
denotes the current instance. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Proof: </B>This is stated officially
as part of the ``current instance'' rule in <A HREF="AA-8-6.html">8.6</A>,
``<A HREF="AA-8-6.html">The Context of Overload Resolution</A>''. See
also <A HREF="AA-12-3.html">12.3</A>, ``<A HREF="AA-12-3.html">Generic
Instantiation</A>''. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>2 Within a generic <FONT FACE="Arial, Helvetica">subprogram_body</FONT>,
the name of this program unit acts as the name of a subprogram. Hence
this name can be overloaded, and it can appear in a recursive call of
the current instance. For the same reason, this name cannot appear after
the reserved word <B>new</B> in a (recursive) <FONT FACE="Arial, Helvetica">generic_instantiation</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>3 A <FONT FACE="Arial, Helvetica">default_expression</FONT>
or <FONT FACE="Arial, Helvetica">default_name</FONT> appearing in a <FONT FACE="Arial, Helvetica">generic_formal_part</FONT>
is not evaluated during elaboration of the <FONT FACE="Arial, Helvetica">generic_formal_part</FONT>;
instead, it is evaluated when used. (The usual visibility rules apply
to any <FONT FACE="Arial, Helvetica">name</FONT> used in a default: the
denoted declaration therefore has to be visible at the place of the expression.)
</FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Examples of
generic formal parts:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B> --<I> parameterless </I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
Size : Natural; --<I> formal object </I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
Length : Integer := 200; --<I> formal object with a default expression</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Examples"><TT> Area : Integer := Length*Length; --<I> formal object with a default expression</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
<B>type</B> Item <B>is</B> <B>private</B>; --<I> formal type</I><BR>
<B>type</B> Index <B>is</B> (<>); --<I> formal type</I><BR>
<B>type</B> Row <B>is</B> <B>array</B>(Index <B>range</B> <>) <B>of</B> Item; --<I> formal type</I><BR>
<B>with</B> <B>function</B> "<"(X, Y : Item) <B>return</B> Boolean; --<I> formal subprogram </I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Examples of generic
declarations declaring generic subprograms Exchange and Squaring:</I>
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
<B>type</B> Elem <B>is</B> <B>private</B>;<BR>
<B>procedure</B> Exchange(U, V : <B>in</B> <B>out</B> Elem);</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>22</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
<B>type</B> Item <B>is</B> <B>private</B>;<BR>
<B>with</B> <B>function</B> "*"(U, V : Item) <B>return</B> Item <B>is</B> <>;<BR>
<B>function</B> Squaring(X : Item) <B>return</B> Item;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>23</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Example of a generic
declaration declaring a generic package:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>24</FONT></DIV>
<DIV Class="Examples"><TT><B>generic</B><BR>
<B>type</B> Item <B>is</B> <B>private</B>;<BR>
<B>type</B> Vector <B>is</B> <B>array</B> (Positive <B>range</B> <>) <B>of</B> Item;<BR>
<B>with</B> <B>function</B> Sum(X, Y : Item) <B>return</B> Item;<BR>
<B>package</B> On_Vectors <B>is</B><BR>
<B>function</B> Sum (A, B : Vector) <B>return</B> Vector;<BR>
<B>function</B> Sigma(A : Vector) <B>return</B> Item;<BR>
Length_Error : <B>exception</B>;<BR>
<B>end</B> On_Vectors;</TT></DIV>
<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>24.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I4183"></A>The syntax
rule for <FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT>
is modified to allow the reserved words <B>tagged</B> and <B>abstract</B>,
to allow formal derived types, and to allow formal packages.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>24.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><FONT FACE="Arial, Helvetica">Use_clause</FONT>s
are allowed in <FONT FACE="Arial, Helvetica">generic_formal_part</FONT>s.
This is necessary in order to allow a <FONT FACE="Arial, Helvetica">use_clause</FONT>
within a formal part to provide direct visibility of declarations within
a generic formal package. </FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>24.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The syntax for <FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT>
and <FONT FACE="Arial, Helvetica">formal_type_definition</FONT> is split
up into more named categories. The rules for these categories are moved
to the appropriate clauses and subclauses. The names of the categories
are changed to be more intuitive and uniform. For example, we changed
<FONT FACE="Arial, Helvetica">generic_parameter_declaration</FONT> to
<FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT>,
because the thing it declares is a generic formal, not a generic. In
the others, we abbreviate ``generic_formal'' to just ``formal''. We can't
do that for <FONT FACE="Arial, Helvetica">generic_formal_parameter_declaration</FONT>,
because of confusion with normal formal parameters of subprograms. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-12.html">Previous</A> <A HREF="AA-12-2.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|