6.1 Subprogram Declarations
Syntax
{
AI95-00395-01}
The sequence of characters in an
operator_symbol
shall form a reserved word, a delimiter, or compound delimiter that corresponds
to an operator belonging to one of the six categories of operators defined
in clause
4.5.
Reason: {
AI95-00395-01}
The ‘sequence of characters” of the string literal of the
operator is a technical term (see
2.6), and
does not include the surrounding quote characters. As defined in
2.2,
lexical elements are “formed” from a sequence of characters.
Spaces are not allowed, and upper and lower case is not significant.
See
2.2 and
2.9 for
rules related to the use of
other_format characters
in delimiters and reserved words.
mode ::= [
in] |
in out |
out
Name Resolution Rules
{formal parameter
(of a subprogram)} A
formal parameter
is an object [directly visible within a
subprogram_body]
that represents the actual parameter passed to the subprogram in a call;
it is declared by a
parameter_specification.
{expected type (parameter default_expression)
[partial]} For a formal parameter, the expected
type for its
default_expression,
if any, is that of the formal parameter.
{parameter:
See formal parameter}
Legality Rules
{parameter mode}
The
parameter mode of a formal parameter conveys
the direction of information transfer with the actual parameter:
in,
in out, or
out. Mode
in is the default, and is the
mode of a parameter defined by an
access_definition.
The formal parameters of a function, if any, shall have the mode
in.
Ramification: Access parameters are permitted.
This restriction to in parameters is primarily a methodological
restriction, though it also simplifies implementation for some compiler
technologies.
Ramification: {
AI95-00348-01}
Abstract subprograms and null procedures are not declared by
subprogram_declarations,
and so do not require completion. Protected subprograms are declared
by
subprogram_declarations,
and so require completion. Note that an abstract subprogram is a subprogram,
and a protected subprogram is a subprogram, but a generic subprogram
is not a subprogram.
Static Semantics
{profile}
The
profile of (a view of) a callable entity
is either a
parameter_profile
or
parameter_and_result_profile[;
it embodies information about the interface to that entity — for
example, the profile includes information about parameters passed to
the callable entity. All callable entities have a profile — enumeration
literals, other subprograms, and entries. An access-to-subprogram type
has a designated profile.] Associated with a profile is a calling convention.
A
subprogram_declaration
declares a procedure or a function, as indicated by the initial reserved
word, with name and profile as given by its specification.
{
AI95-00231-01}
{
AI95-00254-01}
{
AI95-00318-02}
{access parameter} An
access parameter is a formal
in parameter specified by
an
access_definition.
{access result type} An
access result type is a function result type specified by an
access_definition.
An access parameter or result type is of an anonymous access type (see
3.10). [Access parameters of an access-to-object
type allow dispatching calls to be controlled by access values. Access
parameters of an access-to-subprogram type permit calls to subprograms
passed as parameters irrespective of their accessibility level.]
Discussion: {
AI95-00318-02}
Access result types have normal accessibility and thus don't have any
special properties worth noting here.
{subtypes
(of a profile)} The
subtypes of a profile
are:
For any non-access parameters, the nominal subtype
of the parameter.
{
AI95-00254-01}
For any access parameters of an access-to-object type, the designated
subtype of the parameter type.
{
AI95-00254-01}
For any access parameters of an access-to-subprogram type, the subtypes
of the profile of the parameter type.
{
AI95-00318-02}
For any access result type of an access-to-object type, the designated
subtype of the result type.
{
AI95-00318-02}
For any access result type of an access-to-subprogram type, the subtypes
of the profile of the result type.
[
{types (of a profile)}
The
types of a profile are the types of those
subtypes.]
Dynamic Semantics
3 The evaluation of
default_expressions
is caused by certain calls, as described in
6.4.1.
They are not evaluated during the elaboration of the subprogram declaration.
4 Subprograms can be called recursively
and can be called concurrently from multiple tasks.
Examples
Examples of subprogram
declarations:
procedure Traverse_Tree;
procedure Increment(X :
in out Integer);
procedure Right_Indent(Margin :
out Line_Size); --
see 3.5.4
procedure Switch(From, To :
in out Link); --
see 3.10.1
function Random
return Probability; --
see 3.5.7
function Min_Cell(X : Link)
return Cell; --
see 3.10.1
function Next_Frame(K : Positive)
return Frame; --
see 3.10
function Dot_Product(Left, Right : Vector)
return Real; --
see 3.6
function "*"(Left, Right : Matrix)
return Matrix; --
see 3.6
Examples of in
parameters with default expressions:
procedure Print_Header(Pages :
in Natural;
Header :
in Line := (1 .. Line'Last => ' '); --
see 3.6
Center :
in Boolean := True);
Extensions to Ada 83
Program units that are library units may have
a
parent_unit_name
to indicate the parent of a child (see Section 10).
Wording Changes from Ada 83
We have incorporated the rules from RM83-6.5,
“Function Subprograms” here and in
6.3,
“
Subprogram Bodies”
We have incorporated the definitions of RM83-6.6,
“Parameter and Result Type Profile - Overloading of Subprograms”
here.
Extensions to Ada 95
{
AI95-00318-02}
The return type of a function can be an anonymous access type.
Wording Changes from Ada 95
{
AI95-00254-01}
A description of the purpose of anonymous access-to-subprogram parameters
and the definition of the profile of subprograms containing them was
added.