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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Loop Statements</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-5-4.html">Previous</A> <A HREF="AA-5-6.html">Next</A></P>
<HR>
<H1> 5.5 Loop Statements</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [A <FONT FACE="Arial, Helvetica">loop_statement</FONT>
includes a <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
that is to be executed repeatedly, zero or more times.] </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">loop_statement<A NAME="I2965"></A>
::= </FONT><BR>
[<I>loop_</I><A NAME="I2966"></A><FONT FACE="Arial, Helvetica">statement_identifier</FONT>:]<BR>
[<A NAME="I2967"></A><FONT FACE="Arial, Helvetica">iteration_scheme</FONT>] <B>loop</B><BR>
<A NAME="I2968"></A><FONT FACE="Arial, Helvetica">sequence_of_statements</FONT><BR>
<B>end</B> <B>loop</B> [<I>loop_</I><A NAME="I2969"></A><FONT FACE="Arial, Helvetica">identifier</FONT>];</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">iteration_scheme<A NAME="I2970"></A>
::= </FONT><B>while</B> <A NAME="I2971"></A><FONT FACE="Arial, Helvetica">condition</FONT><BR>
| <B>for</B> <A NAME="I2972"></A><FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">loop_parameter_specification<A NAME="I2973"></A>
::= </FONT><BR>
<A NAME="I2974"></A><FONT FACE="Arial, Helvetica">defining_identifier</FONT> <B>in</B> [<B>reverse</B>] <A NAME="I2975"></A><FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="SyntaxIndented">If a <FONT FACE="Arial, Helvetica">loop_statement</FONT>
has a <I>loop_</I><FONT FACE="Arial, Helvetica">statement_identifier</FONT>,
then the <FONT FACE="Arial, Helvetica">identifier</FONT> shall be repeated
after the <B>end loop</B>; otherwise, there shall not be an <FONT FACE="Arial, Helvetica">identifier</FONT>
after the <B>end loop</B>. </DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2976"></A>A <FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT>
declares a <I>loop parameter</I>, which is an object whose subtype is
that defined by the <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>.
<A NAME="I2977"></A></DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2978"></A>For the execution of a <FONT FACE="Arial, Helvetica">loop_statement</FONT>,
the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT> is executed
repeatedly, zero or more times, until the <FONT FACE="Arial, Helvetica">loop_statement</FONT>
is complete. The <FONT FACE="Arial, Helvetica">loop_statement</FONT>
is complete when a transfer of control occurs that transfers control
out of the loop, or, in the case of an <FONT FACE="Arial, Helvetica">iteration_scheme</FONT>,
as specified below.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2979"></A>For the execution of a <FONT FACE="Arial, Helvetica">loop_statement</FONT>
with a <B>while</B> <FONT FACE="Arial, Helvetica">iteration_scheme</FONT>,
the condition is evaluated before each execution of the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>;
if the value of the <FONT FACE="Arial, Helvetica">condition</FONT> is
True, the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
is executed; if False, the execution of the <FONT FACE="Arial, Helvetica">loop_statement</FONT>
is complete.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2980"></A><A NAME="I2981"></A>For the
execution of a <FONT FACE="Arial, Helvetica">loop_statement</FONT> with
a <B>for</B> <FONT FACE="Arial, Helvetica">iteration_scheme</FONT>, the
<FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT> is
first elaborated. This elaboration creates the loop parameter and elaborates
the <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>.
If the <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>
defines a subtype with a null range, the execution of the <FONT FACE="Arial, Helvetica">loop_statement</FONT>
is complete. Otherwise, the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
is executed once for each value of the discrete subtype defined by the
<FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT> (or
until the loop is left as a consequence of a transfer of control). <A NAME="I2982"></A>Prior
to each such iteration, the corresponding value of the discrete subtype
is assigned to the loop parameter. These values are assigned in increasing
order unless the reserved word <B>reverse</B> is present, in which case
the values are assigned in decreasing order. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The order
of creating the loop parameter and evaluating the <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>
doesn't matter, since the creation of the loop parameter has no side
effects (other than possibly raising Storage_Error, but anything can
do that). </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>6 A loop parameter is a constant;
it cannot be updated within the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
of the loop (see <A HREF="AA-3-3.html">3.3</A>).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>7 An <FONT FACE="Arial, Helvetica">object_declaration</FONT>
should not be given for a loop parameter, since the loop parameter is
automatically declared by the <FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT>.
The scope of a loop parameter extends from the <FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT>
to the end of the <FONT FACE="Arial, Helvetica">loop_statement</FONT>,
and the visibility rules are such that a loop parameter is only visible
within the <FONT FACE="Arial, Helvetica">sequence_of_statements</FONT>
of the loop. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Implementation Note: </B>An
implementation could give a warning if a variable is hidden by a <FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>8 The <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>
of a for loop is elaborated just once. Use of the reserved word <B>reverse</B>
does not alter the discrete subtype defined, so that the following <FONT FACE="Arial, Helvetica">iteration_scheme</FONT>s
are not equivalent; the first has a null range. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT><B>for</B> J <B>in</B> <B>reverse</B> 1 .. 0<BR>
<B>for</B> J <B>in</B> 0 .. 1</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>If a <FONT FACE="Arial, Helvetica">loop_parameter_specification</FONT>
has a static discrete range, the subtype of the loop parameter is static.
</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>Example of a
loop statement without an iteration scheme:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT><B>loop</B><BR>
Get(Current_Character);<BR>
<B>exit</B> <B>when</B> Current_Character = '*';<BR>
<B>end</B> <B>loop</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Example of a loop
statement with a <B>while</B> iteration scheme:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Examples"><TT><B>while</B> Bid(N).Price < Cut_Off.Price <B>loop</B><BR>
Record_Bid(Bid(N).Price);<BR>
N := N + 1;<BR>
<B>end</B> <B>loop</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Example of a loop
statement with a <B>for</B> iteration scheme:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Examples"><TT><B>for</B> J <B>in</B> Buffer'Range <B>loop</B> --<I> works even with a null range</I><BR>
<B>if</B> Buffer(J) /= Space <B>then</B><BR>
Put(Buffer(J));<BR>
<B>end</B> <B>if</B>;<BR>
<B>end</B> <B>loop</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Example of a loop
statement with a name:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Examples"><TT>Summation:<BR>
<B>while</B> Next /= Head <B>loop</B> --<I> see <A HREF="AA-3-10-1.html">3.10.1</A></I><BR>
Sum := Sum + Next.Value;<BR>
Next := Next.Succ;<BR>
<B>end</B> <B>loop</B> Summation;</TT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>21.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The constant-ness of loop parameters
is specified in <A HREF="AA-3-3.html">3.3</A>, ``<A HREF="AA-3-3.html">Objects
and Named Numbers</A>''. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-5-4.html">Previous</A> <A HREF="AA-5-6.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|