File: AA-4-3-2.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 (187 lines) | stat: -rw-r--r-- 14,385 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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Extension Aggregates</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-3-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-3-3.html">Next</A></P>
<HR>
<H1> 4.3.2 Extension Aggregates</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;[An <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>
specifies a value for a type that is a record extension by specifying
a value or subtype for an ancestor of the type, followed by associations
for any components not determined by the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>.]
</DIV>

<H4 ALIGN=CENTER>Language Design Principles</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The model underlying this syntax
is that a record extension can also be viewed as a regular record type
with an ancestor &quot;prefix.&quot; The <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>
corresponds to exactly what would be needed if there were no ancestor/prefix
type. The <FONT FACE="Arial, Helvetica">ancestor_part</FONT> determines
the value of the ancestor/prefix. </FONT></DIV>

<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">extension_aggregate<A NAME="I2388"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;(<A NAME="I2389"></A><FONT FACE="Arial, Helvetica">ancestor_part</FONT>&nbsp;<B>with</B>&nbsp;<A NAME="I2390"></A><FONT FACE="Arial, Helvetica">record_component_association_list</FONT>)</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">ancestor_part<A NAME="I2391"></A>
::= </FONT><A NAME="I2392"></A><FONT FACE="Arial, Helvetica">expression</FONT>&nbsp;|&nbsp;<A NAME="I2393"></A><FONT FACE="Arial, Helvetica">subtype_mark</FONT></DIV>

<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I2394"></A>The expected type for an <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>
shall be a single nonlimited type that is a record extension. <A NAME="I2395"></A>If
the <FONT FACE="Arial, Helvetica">ancestor_part</FONT> is an <FONT FACE="Arial, Helvetica">expression</FONT>,
it is expected to be of any nonlimited tagged type. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>We could have made
the expected type <I>T'</I>Class where <I>T</I> is the ultimate ancestor
of the type of the aggregate, or we could have made it even more specific
than that. However, if the overload resolution rules get too complicated,
the implementation gets more difficult and it becomes harder to produce
good error messages. </FONT></DIV>

<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;If the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>
is a <FONT FACE="Arial, Helvetica">subtype_mark</FONT>, it shall denote
a specific tagged subtype. The type of the <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>
shall be derived from the type of the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>,
through one or more record extensions (and no private extensions). </DIV>

<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I2396"></A>For the <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>
of an <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>, the only
components <I>needed</I> are those of the composite value defined by
the aggregate that are not inherited from the type of the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>,
plus any inherited discriminants if the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>
is a <FONT FACE="Arial, Helvetica">subtype_mark</FONT> that denotes an
unconstrained subtype. </DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I2397"></A>For the evaluation of an <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>,
the <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>
is evaluated. If the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>
is an <FONT FACE="Arial, Helvetica">expression</FONT>, it is also evaluated;
if the <FONT FACE="Arial, Helvetica">ancestor_part</FONT> is a <FONT FACE="Arial, Helvetica">subtype_mark</FONT>,
the components of the value of the aggregate not given by the <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>
are initialized by default as for an object of the ancestor type. Any
implicit initializations or evaluations are performed in an arbitrary
order, except that the <FONT FACE="Arial, Helvetica">expression</FONT>
for a discriminant is evaluated prior to any other evaluation or initialization
that depends on it.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I2398"></A><A NAME="I2399"></A>If the
type of the <FONT FACE="Arial, Helvetica">ancestor_part</FONT> has discriminants
that are not inherited by the type of the <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>,
then, unless the <FONT FACE="Arial, Helvetica">ancestor_part</FONT> is
a <FONT FACE="Arial, Helvetica">subtype_mark</FONT> that denotes an unconstrained
subtype, a check is made that each discriminant of the ancestor has the
value specified for a corresponding discriminant, either in the <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>,
or in the <FONT FACE="Arial, Helvetica">derived_type_definition</FONT>
for some ancestor of the type of the <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>.
<A NAME="I2400"></A>Constraint_Error is raised if this check fails. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Corresponding
and specified discriminants are defined in <A HREF="AA-3-7.html">3.7</A>.
The rules requiring static compatibility between new discriminants of
a derived type and the parent discriminant(s) they constrain ensure that
at most one check is required per discriminant of the ancestor expression.
</FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>8&nbsp;&nbsp;If all components of the
value of the <FONT FACE="Arial, Helvetica">extension_aggregate</FONT>
are determined by the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>,
then the <FONT FACE="Arial, Helvetica">record_component_association_list</FONT>
is required to be simply <B>null record</B>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>9&nbsp;&nbsp;If the <FONT FACE="Arial, Helvetica">ancestor_part</FONT>
is a <FONT FACE="Arial, Helvetica">subtype_mark</FONT>, then its type
can be abstract. If its type is controlled, then as the last step of
evaluating the aggregate, the Initialize procedure of the ancestor type
is called, unless the Initialize procedure is abstract (see <A HREF="AA-7-6.html">7.6</A>).
</FONT></DIV>

<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of
extension aggregates (for types defined in <A HREF="AA-3-9-1.html">3.9.1</A>):</I>
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Examples"><TT>Painted_Point'(Point&nbsp;<B>with</B>&nbsp;Red)<BR>
(Point'(P)&nbsp;<B>with</B>&nbsp;Paint&nbsp;=&gt;&nbsp;Black)</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>(Expression&nbsp;<B>with</B>&nbsp;Left&nbsp;=&gt;&nbsp;1.2,&nbsp;Right&nbsp;=&gt;&nbsp;3.4)<BR>
Addition'(Binop&nbsp;<B>with&nbsp;null&nbsp;record</B>)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;presuming&nbsp;Binop&nbsp;is&nbsp;of&nbsp;type&nbsp;Binary_Operation</I></TT></DIV>

<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>13.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I2401"></A>The extension
aggregate syntax is new. </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-3-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-4-3-3.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>