Это старая версия документа!
Суть этой возможности в Компонентном Паскале состоит в том, что можно создать переменную, которой позже можно присвоить адрес какой-либо процедуры, после чего, можно использовать эту переменную как саму процедуру.
При этом, нужно помнить, что список аргументов у переменной процедурного типа и самой процедуры должны совпадать.
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.