File: AA-4-5-3.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (188 lines) | stat: -rw-r--r-- 14,955 bytes parent folder | download
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Binary Adding Operators</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>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-5-2.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-5-4.html">Next</A></P>
<HR>
<H1> 4.5.3 Binary Adding Operators</H1>

<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<A NAME="I2639"></A><A NAME="I2640"></A><A NAME="I2641"></A><A NAME="I2642"></A><A NAME="I2643"></A><A NAME="I2644"></A><A NAME="I2645"></A><A NAME="I2646"></A><A NAME="I2647"></A><A NAME="I2648"></A>The
binary adding operators + (addition) and - (subtraction) are predefined
for every specific numeric type <I>T</I> with their conventional meaning.
They have the following specifications: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Examples"><TT><B>function</B>&nbsp;&quot;+&quot;(Left,&nbsp;Right&nbsp;:&nbsp;<I>T</I>)&nbsp;<B>return</B>&nbsp;<I>T</I><BR>
<B>function</B>&nbsp;&quot;-&quot;(Left,&nbsp;Right&nbsp;:&nbsp;<I>T</I>)&nbsp;<B>return</B>&nbsp;<I>T</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<A NAME="I2649"></A><A NAME="I2650"></A><A NAME="I2651"></A><A NAME="I2652"></A><A NAME="I2653"></A><A NAME="I2654"></A><A NAME="I2655"></A>The
concatenation operators &amp; are predefined for every nonlimited, one-dimensional
array type <I>T</I> with component type <I>C</I>. They have the following
specifications: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Examples"><TT><B>function</B>&nbsp;&quot;&amp;&quot;(Left&nbsp;:&nbsp;<I>T</I>;&nbsp;Right&nbsp;:&nbsp;<I>T</I>)&nbsp;<B>return</B>&nbsp;<I>T</I><BR>
<B>function</B>&nbsp;&quot;&amp;&quot;(Left&nbsp;:&nbsp;<I>T</I>;&nbsp;Right&nbsp;:&nbsp;<I>C</I>)&nbsp;<B>return</B>&nbsp;<I>T</I><BR>
<B>function</B>&nbsp;&quot;&amp;&quot;(Left&nbsp;:&nbsp;<I>C</I>;&nbsp;Right&nbsp;:&nbsp;<I>T</I>)&nbsp;<B>return</B>&nbsp;<I>T</I><BR>
<B>function</B>&nbsp;&quot;&amp;&quot;(Left&nbsp;:&nbsp;<I>C</I>;&nbsp;Right&nbsp;:&nbsp;<I>C</I>)&nbsp;<B>return</B>&nbsp;<I>T</I></TT></DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<A NAME="I2656"></A>For
the evaluation of a concatenation with result type <I>T</I>, if both
operands are of type <I>T</I>, the result of the concatenation is a one-dimensional
array whose length is the sum of the lengths of its operands, and whose
components comprise the components of the left operand followed by the
components of the right operand. If the left operand is a null array,
the result of the concatenation is the right operand. Otherwise, the
lower bound of the result is determined as follows: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the ultimate ancestor of the array type was defined
by a <FONT FACE="Arial, Helvetica">constrained_array_definition</FONT>,
then the lower bound of the result is that of the index subtype; </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>6.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This rule avoids
Constraint_Error when using concatenation on an array type whose first
subtype is constrained. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the ultimate ancestor of the array type was defined
by an <FONT FACE="Arial, Helvetica">unconstrained_array_definition</FONT>,
then the lower bound of the result is that of the left operand. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;[The upper bound is determined by the lower bound
and the length.] <A NAME="I2657"></A><A NAME="I2658"></A>A check is made
that the upper bound of the result of the concatenation belongs to the
range of the index subtype, unless the result is a null array. <A NAME="I2659"></A>Constraint_Error
is raised if this check fails.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;If either operand is of the component type <I>C</I>,
the result of the concatenation is given by the above rules, using in
place of such an operand an array having this operand as its only component
(converted to the component subtype) and having the lower bound of the
index subtype of the array type as its lower bound. <A NAME="I2660"></A></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The conversion
might raise Constraint_Error. The conversion provides ``sliding'' for
the component in the case of an array-of-arrays, consistent with the
normal Ada 95 rules that allow sliding during parameter passing. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I2661"></A>The result of a concatenation
is defined in terms of an assignment to an anonymous object, as for any
function call (see <A HREF="AA-6-5.html">6.5</A>). </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This implies
that value adjustment is performed as appropriate -- see <A HREF="AA-7-6.html">7.6</A>.
We don't bother saying this for other predefined operators, even though
they are all function calls, because this is the only one where it matters.
It is the only one that can return a value having controlled parts. </FONT></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>15&nbsp;&nbsp;As for all predefined
operators on modular types, the binary adding operators + and - on modular
types include a final reduction modulo the modulus if the result is outside
the base range of the type. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Implementation Note: </B>A
full &quot;modulus&quot; operation need not be performed after addition
or subtraction of modular types. For binary moduli, a simple mask is
sufficient. For nonbinary moduli, a check after addition to see if the
value is greater than the high bound of the base range can be followed
by a conditional subtraction of the modulus. Conversely, a check after
subtraction to see if a &quot;borrow&quot; was performed can be followed
by a conditional addition of the modulus. </FONT></DIV>

<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of
expressions involving binary adding operators:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>Z&nbsp;+&nbsp;0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;Z&nbsp;has&nbsp;to&nbsp;be&nbsp;of&nbsp;a&nbsp;real&nbsp;type&nbsp;</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Examples"><TT>&quot;A&quot;&nbsp;&amp;&nbsp;&quot;BCD&quot;&nbsp;&nbsp;<I>--&nbsp;&nbsp;concatenation&nbsp;of&nbsp;two&nbsp;string&nbsp;literals</I><BR>
'A'&nbsp;&amp;&nbsp;&quot;BCD&quot;&nbsp;&nbsp;<I>--&nbsp;&nbsp;concatenation&nbsp;of&nbsp;a&nbsp;character&nbsp;literal&nbsp;and&nbsp;a&nbsp;string&nbsp;literal</I><BR>
'A'&nbsp;&amp;&nbsp;'A'&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;concatenation&nbsp;of&nbsp;two&nbsp;character&nbsp;literals&nbsp;</I></TT></DIV>

<H4 ALIGN=CENTER>Inconsistencies With Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I2662"></A>The lower
bound of the result of concatenation, for a type whose first subtype
is constrained, is now that of the index subtype. This is inconsistent
with Ada 83, but generally only for Ada 83 programs that raise Constraint_Error.
For example, the concatenation operator in </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.b</FONT></DIV>
<DIV Class="SmallExamples"><TT>X&nbsp;:&nbsp;<B>array</B>(1..10)&nbsp;<B>of</B>&nbsp;Integer;<BR>
<B>begin</B><BR>
X&nbsp;:=&nbsp;X(6..10)&nbsp;&amp;&nbsp;X(1..5);</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>would raise Constraint_Error in
Ada 83 (because the bounds of the result of the concatenation would be
6..15, which is outside of 1..10), but would succeed and swap the halves
of X (as expected) in Ada 95. </FONT></DIV>

<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I2663"></A>Concatenation
is now useful for array types whose first subtype is constrained. When
the result type of a concatenation is such an array type, Constraint_Error
is avoided by effectively first sliding the left operand (if nonnull)
so that its lower bound is that of the index subtype. </FONT></DIV>

<HR>
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-5-2.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-5-4.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>