____ | Up | Next | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


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)
(9)
       operator_symbol ::= string_literal
(10)
(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)
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. For a formal parameter, the expected type for its default_expression, if any, is that of the formal parameter.
Legality Rules
(18)
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.
(19)
A default_expression is only allowed in a parameter_specification for a formal parameter of mode in.
(20)
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.
(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.
Static Semantics
(22)
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)
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)
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)
The subtypes of a profile are:
(26)
(27)
(28)
(29)
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)
The elaboration of a subprogram_declaration or an abstract_subprogram_declaration has no effect.

(32)
(33)
(34)
(35)
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);


____ | Up | Next | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12