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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-4-3-1.html">Previous</A> <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"> [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 "prefix." 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>
(<A NAME="I2389"></A><FONT FACE="Arial, Helvetica">ancestor_part</FONT> <B>with</B> <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> | <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"> <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"> 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"> <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"> <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"> <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 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 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"> <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 <B>with</B> Red)<BR>
(Point'(P) <B>with</B> Paint => Black)</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>(Expression <B>with</B> Left => 1.2, Right => 3.4)<BR>
Addition'(Binop <B>with null record</B>)<BR>
<I>-- presuming Binop is of type 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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-4-3-1.html">Previous</A> <A HREF="AA-4-3-3.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|