Previous: 2.2.12.5. Procedural Value To the Table of Contents Next: 2.2.13. OOP Extensions
2.2.12.5. Procedural Value Table of Contents 2.2.13. OOP Extensions

- 2.2.12.6. -
Table of Contents
2. TMT Pascal Language Description
2.2. Pascal Language Structure
2.2.12. Procedures and Functions
2.2.12.6. Using Statement as Procedure


2.2.12.6. Using Statement as Procedure


With TMT Pascal you can use any statement as a procedure body, except for the assignment and the procedure calls.

The RESULT variable in the body of such functions denotes the variable that contains the return value. The RESULT is of the function return type and may be used as a variable without any restrictions.

With TMT Pascal you can enter the procedure body directly as a procedure parameter. The procedure or function header (if not specified) takes the procedural parameter type. If the procedure header is specified, the procedure name is omitted.

Example:
function Integral(function f(a: Real):Real;
                   low, high, step: Real): Real;
begin
 ... 
end;
 ...
Writeln(integral (function(x: Real): Real;
                  begin Result := sqrt(x) end, 0, 10, 0.1));
Writeln(integral(begin Result := sqrt(a) end, 0, 10, 0.1));
Writeln(integral(function;     // function keyword needed
                 var x: Real;  // for local declaration
                 begin x := sqrt(a); Result := x end, 0, 10, 0.1)
                );
Writeln(integral(declare;      // other way
                 var x: Real;  // for local variable declaration
                 begin
                   x := sqrt(a);
                   Result := x 
                 end, 0, 10, 0.1)
                 );
TMT Pascal allows exit from a local procedure to the one that contains it. This feature is listed in the Pascal's ANSI standard but not realized in Borland Pascal. Together with procedural values, this is very useful for error handling:
program Test;
var
  on_eof: procedure;
  function read_char: char;
var c: char;

begin
  if Eof (Input) then on_eof;
  Read(c);
  Read_char := c;
end;
procedure MyProc;
label eof_reached;
  procedure go_eof; 
  begin 
    goto eof_reached; 
  end;
  begin
    on_eof := go_eof;
    while True do Write (read_char);

Eof_reached:
    writeln ('*** EOF ***');
    on_eof := nil;
  end;
begin
  MyProc;
end.
Restriction: Break and Continue operators cannot be used for exit from a procedure. Use Goto instead.

Example:
{ incorrect example }
for i := 1 to 10 do
  Writeln ( integral(            // from previous example
            if a < 0 then break  // incorrect
            else result := sqrt (a), i, i + 1, 0.01)
          );

{ correct example }
declare
  label L;
begin
  for i := 1 to 10 do Writeln (
  integral(
           if a < 0
           then goto L  // correct
           else result := sqrt (a), i, i + 1, 0.01)
          );
Functions may return any values of any type, including structures and arrays.


Previous: 2.2.12.5. Procedural Value To the Table of Contents Next: 2.2.13. OOP Extensions
2.2.12.5. Procedural Value Table of Contents 2.2.13. OOP Extensions

- 2.2.12.6. -