Contents Index Search Previous Next
6.1 Subprogram Declarations
1
[A subprogram_declaration
declares a procedure or function.]
Syntax
2
subprogram_declaration
::= subprogram_specification;
3
abstract_subprogram_declaration
::= subprogram_specification is abstract;
4
subprogram_specification
::=
procedure defining_program_unit_name parameter_profile
|
function defining_designator parameter_and_result_profile
5
designator
::= [
parent_unit_name . ]
identifier |
operator_symbol
6
defining_designator
::= defining_program_unit_name |
defining_operator_symbol
7
defining_program_unit_name
::= [
parent_unit_name . ]
defining_identifier
8
[The optional
parent_unit_name
is only allowed for library units (see
10.1.1).]
9
operator_symbol
::= string_literal
10
The sequence of characters in an
operator_symbol
shall correspond to an operator belonging to one of the six classes of
operators defined in clause
4.5 (spaces are
not allowed and the case of letters is not significant).
11
defining_operator_symbol
::= operator_symbol
12
parameter_profile
::= [
formal_part]
13
parameter_and_result_profile
::= [
formal_part]
return subtype_mark
14
formal_part
::=
(
parameter_specification {;
parameter_specification})
15
parameter_specification
::=
defining_identifier_list :
mode subtype_mark [:=
default_expression]
|
defining_identifier_list :
access_definition [:=
default_expression]
16
mode
::= [
in] |
in out |
out
Name Resolution Rules
17
{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
18
{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.
18.a
Ramification: Access
parameters are permitted. This restriction to in parameters is
primarily a methodological restriction, though it also simplifies implementation
for some compiler technologies.
19
A default_expression
is only allowed in a parameter_specification
for a formal parameter of mode in.
20
{requires a completion (subprogram_declaration)
[partial]} {requires a
completion (generic_subprogram_declaration) [partial]} A
subprogram_declaration or a
generic_subprogram_declaration
requires a completion: [a body, a
renaming_declaration
(see
8.5), or a
pragma Import (see
B.1)].
[A completion is not allowed for an
abstract_subprogram_declaration.]
20.a
Ramification: Abstract
subprograms 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.
21
A name that
denotes a formal parameter is not allowed within the formal_part
in which it is declared, nor within the formal_part
of a corresponding body or accept_statement.
21.a
Ramification: By contrast,
generic_formal_parameter_declarations
are visible to subsequent declarations in the same generic_formal_part.
Static Semantics
22
{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.
23
{nominal subtype (of a formal
parameter) [partial]} The nominal subtype
of a formal parameter is the subtype denoted by the
subtype_mark,
or defined by the
access_definition,
in the
parameter_specification.
24
{access parameter}
An
access parameter is a formal
in
parameter specified by an
access_definition.
An access parameter is of an anonymous general access-to-variable type
(see
3.10). [Access parameters allow dispatching
calls to be controlled by access values.]
25
{subtypes
(of a profile)} The
subtypes of a profile
are:
26
- For any non-access parameters, the
nominal subtype of the parameter.
27
- For any access parameters, the designated
subtype of the parameter type.
28
- For any result, the result subtype.
29
[
{types (of a profile)}
The
types of a profile are the types of those
subtypes.]
30
[A subprogram declared by an
abstract_subprogram_declaration
is abstract; a subprogram declared by a
subprogram_declaration
is not. See
3.9.3, ``
Abstract
Types and Subprograms''.]
Dynamic Semantics
31
{elaboration (subprogram_declaration)
[partial]} {elaboration
(abstract_subprogram_declaration) [partial]} The
elaboration of a
subprogram_declaration
or an
abstract_subprogram_declaration
has no effect.
32
1 A parameter_specification
with several identifiers is equivalent to a sequence of single parameter_specifications,
as explained in 3.3.
33
34
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.
35
4 Subprograms can be called
recursively and can be called concurrently from multiple tasks.
Examples
36
Examples of
subprogram declarations:
37
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
38
function Random return Probability; -- see 3.5.7
39
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
40
function "*"(Left, Right : Matrix) return Matrix; -- see 3.6
41
Examples of in
parameters with default expressions:
42
procedure Print_Header(Pages : in Natural;
Header : in Line := (1 .. Line'Last => ' '); -- see 3.6
Center : in Boolean := True);
Extensions to Ada 83
42.a
{extensions to Ada 83}
The syntax for abstract_subprogram_declaration
is added. The syntax for parameter_specification
is revised to allow for access parameters (see 3.10)
42.b
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
42.c
We have incorporated the rules
from RM83-6.5, ``Function Subprograms'' here and in 6.3,
``Subprogram Bodies''
42.d
We have incorporated the definitions
of RM83-6.6, ``Parameter and Result Type Profile - Overloading of Subprograms''
here.
42.e
The syntax rule for defining_operator_symbol
is new. It is used for the defining occurrence of an operator_symbol,
analogously to defining_identifier.
Usage occurrences use the direct_name
or selector_name syntactic categories.
The syntax rules for defining_designator
and defining_program_unit_name are
new.
Contents Index Search Previous Next Legal