                PROCEDURES AND FUNCTIONS. 
                

 Procedures and functions allow additional blocks to be nested in the main
 program block.  Each procedure or function declaration has a heading
 followed by a block.  A procedure is activated by a procedure statement; a
 function is activated by the evaluation of an expression that contains its
 call and returns a value to that expression. 

 A procedure heading consists of the reserved word PROCEDURE, followed by
 the procedure identifier (or name) and followed optionally by any formal
 parameters.  The procedure body consists principally of a block of Pascal
 statements, but also can include assembler code and reserved words like
 NEAR and FAR (to be discussed later). 

 A function heading consists of the reserved word FUNCTION, followed by the
 function identifier, an optional parameter list, a colon and then the
 result type.  The function body consists principally of a block of Pascal
 statements, but also possibly assembler code and other reserved words. 

 For both procedures and functions, each parameter declared in a formal
 parameter list is local to the procedure or function being declared and can
 be referred to by its identifier in the block associated with the procedure
 or function. 

 The formal parameter list is enclosed in parentheses and concluded by a
 semi-colon.  There are three kinds of parameter: value, variable and
 untyped variable. 

 A parameter group without a preceding VAR and followed by a type is a list
 of value parameters (when the value of the parameter is changed it only
 affects a temporary store and not the actual variable outside the
 procedure). 

 A parameter group preceded by VAR and followed by a type is a list of
 variable parameters.  Such parameters are called reference parameters and
 changes made to the variable within the procedure remain even after the
 procedure has ended. 

 A parameter group preceded by VAR and not followed by a type is a list of
 untyped variable parameters. 

 See Chapter 8 of the Programmer's Guide (pp 95- 112) for further details.

 A simple example of a procedure is illustrated in the program PROC.PAS
 which has a procedure TimesTable, which lists on the screen any chosen
 part of a multiplication table, for multiplicands and multipliers all less
 than 100. This procedure is listed below:

 procedure TimesTable(BaseValue,Lower,Upper: integer);
 begin
   writeln;
   writeln(BaseValue,' Times Table');
   writeln;
   For i:=Lower to Upper do writeln(BaseValue:2,' * ',i:2,' = ',BaseValue*i:5);
 end;

 In the main part of the program, the user is asked for values of the three
 parameters and then effectively the procedure is called as follows:

       TimesTable(57,10,20);

 which then displays   57 * 10 = 570
                       57 * 11 = 627
              etc. to  57 * 20 = 1140

 An example of a function is illustrated in the program FUNC.PAS which
 defines a function as follows:
          function Power(Base, Exponent : real) : real;
          begin
             .....
             Power := exp(Exponent * ln(Base))
             .....
          end;

 This enables the evaluation of any number to any power, provided the
 result does not involve complex numbers. Thus if number is negative
 and power is fractional, a warning is given.

 The function is effectively called as for example:   Result := Power(2,3);
 although the example program involves a user interaction for the values.


 PROCFUNC.TXT
 14.1.93

