Section 6: Subprograms


Section 6: Subprograms

1 {subprogram} {procedure} {function} A subprogram is a program unit or intrinsic operation whose execution is invoked by a subprogram call. There are two forms of subprogram: procedures and functions. A procedure call is a statement; a function call is an expression and returns a value. The definition of a subprogram can be given in two parts: a subprogram declaration defining its interface, and a subprogram_body defining its execution. [Operators and enumeration literals are functions.] 

1.a To be honest: A function call is an expression, but more specifically it is a name

1.b/2 Glossary entry: {Subprogram} A subprogram is a section of program that can be executed in various contexts. It is invoked by a subprogram call that may qualify the effect of the subprogram through the passing of parameters. There are two forms of subprograms: functions, which return values, and procedures, which do not.

1.c/2 Glossary entry: {Function} A function is a form of subprogram that returns a result and can be called as part of an expression.

1.d/2 Glossary entry: {Procedure} A procedure is a form of subprogram that does not return a result and can only be called by a statement.

2 {callable entity} A callable entity is a subprogram or entry (see Section 9). {call} A callable entity is invoked by a call; that is, a subprogram call or entry call. {callable construct} A callable construct is a construct that defines the action of a call upon a callable entity: a subprogram_body, entry_body, or accept_statement.

2.a Ramification: Note that “callable entity” includes predefined operators, enumeration literals, and abstract subprograms. “Call” includes calls of these things. They do not have callable constructs, since they don't have completions.


The abstraction in AAda takes the result of a function as a parameter instead.

This a function declaration that looks like this:

function foo(a; b; c) return d;

is to be transformed into something like this:

procedure foo(a; b; c; d: out ...);

This not only simplifies returning of complex types, it also simplifies searching for the right overloaded procedure or function.