Это старая версия документа!
Суть этой возможности в Компонентном Паскале состоит в том, что можно создать переменную, которой позже можно присвоить адрес какой-либо процедуры, после чего, можно использовать эту переменную как саму процедуру.
При этом, нужно помнить, что список аргументов у переменной процедурного типа и самой процедуры должны совпадать.
MODULE FunctionalCalculator;
IMPORT Out := StdLog;
TYPE
Calculator = PROCEDURE (a, b: LONGINT): LONGINT;
CalculatorBoolean = PROCEDURE (a, b: LONGINT): BOOLEAN;
PROCEDURE Add(a, b: LONGINT): LONGINT;
BEGIN RETURN a + b END Add;
PROCEDURE Sub(a, b: LONGINT): LONGINT;
BEGIN RETURN a - b END Sub;
PROCEDURE Mul(a, b: LONGINT): LONGINT;
BEGIN RETURN a * b END Mul;
PROCEDURE Div(a, b: LONGINT): LONGINT;
BEGIN RETURN a DIV b END Div;
PROCEDURE Greater(a, b: LONGINT): BOOLEAN;
BEGIN RETURN a > b END Greater;
PROCEDURE Less(a, b: LONGINT): BOOLEAN;
BEGIN RETURN a < b END Less;
PROCEDURE ReduceLongint(nums: ARRAY OF LONGINT; c: Calculator): LONGINT;
VAR
i, res: LONGINT;
BEGIN
res := nums[0];
FOR i := 1 TO LEN(nums) - 1 DO
res := c(res, nums[i]);
END;
RETURN res;
END ReduceLongint;
PROCEDURE ReduceBoolean(nums: ARRAY OF LONGINT; c: CalculatorBoolean): BOOLEAN;
VAR
i: LONGINT;
res: BOOLEAN;
BEGIN
res := TRUE;
FOR i := 1 TO LEN(nums) - 1 DO
res := res & c(nums[i-1], nums[i]);
END;
RETURN res;
END ReduceBoolean;
PROCEDURE Start*;
VAR
sn: ARRAY 5 OF LONGINT; (* sn - some nums *)
orderedNums: ARRAY 3 OF LONGINT;
sum, mul: LONGINT;
greater, less: BOOLEAN;
BEGIN
sn[0] := 1; sn[1] := 3; sn[2] := 5; sn[3] := 7; sn[4] := 9;
sum := ReduceLongint(sn, Add);
Out.String('sum = '); Out.Int(sum); Out.Ln;
mul := ReduceLongint(sn, Mul);
Out.String('mul = '); Out.Int(mul); Out.Ln;
orderedNums[0] := 7;
orderedNums[1] := 5;
orderedNums[2] := 1;
greater := ReduceBoolean(orderedNums, Greater);
Out.String('greater = '); Out.Bool(greater); Out.Ln;
less := ReduceBoolean(orderedNums, Less);
Out.String('less = '); Out.Bool(less); Out.Ln;
END Start;
END FunctionalCalculator.
Если переменной процедурного типа не присвоить значение, она будет иметь значение NIL.