Turbo Pascal позволяет вводить переменные специального вида, значениями которых могут служить подпрограммы. Иными словами, Turbo Pascal позволяет интерпретировать процедуры и функции как значения, которые можно присваивать переменным и использовать в качестве параметров. Речь идёт о подпрограммах как о целостных объектах, а не о значениях, возникающих в результате их выполнения.
Пример
var
P: procedure;
Возможными значениями переменной P могут являться любые процедуры без параметров.
В общем случае процедурный тип задаётся конструкцией, очень похожей на заголовок процедуры или функции.
Пример
type
Func=function(x,y: integer): integer;
var
F1, F2: Func;
Переменным F1 и F2 могут быть присвоены в качестве значений функции от двух целых параметров, возвращающие целый результат. Если в этой программе есть описание функции
function Add(a,b: integer):integer;
begin
Add:=a+b
end;
то допустимо присвоение вида F1:=Add;
Переменной F1 в качестве значения присваивается функция как таковая. Выполнения этой функции не происходит.
После такого присваивания имеется возможность вызывать функцию Add как по значению, так и с помощью указания переменной F1, то есть
writeln(Add(1, 2)); writeln(F1(1, 2)); Оба оператора напечатают число 3.
Определение процедурного типа аналогично заголовку подпрограммы с той лишь разницей, что имя подпрограммы не задаётся.
Пример
type
Proc= procedure;
BinOperation= function(x,y: real): real;
UnOperation= function(x: real): real;
Reading= procedure(var f: text; var Elem: char);
Имена формальных параметров, указываемых в процедурных типах, играют чисто иллюстративную роль, на смысл определений никакого влияния не оказывают. Необходимыми являются только идентификаторы типов параметров и результатов. Последнее указывается для функций.
Turbo Pascal позволяет определять переменные, значениями которых могут быть процедуры и функции. Для таких переменных допускаются операторы присваивания, в правых частях которых находятся идентификаторы других процедурных переменных или идентификаторов подпрограммы. Переменная процедурного типа в различные моменты времени может иметь в качестве значения различные подпрограммы.
Такие переменные могут быть использованы для вызова подпрограмм, которые присвоены этим переменным.
Пример
Пусть в программе есть
var
operation: function(x,y: real): real;
function Add(a,b: real):real;
begin
Add:=a+b
end;
function Sub(a,b: real): real;
begin
Sub:=a-b
end;
и выполняется
if condition then operation:=Add
else operation:=Sub;
writeln(operation(2.05,3+x));
В зависимости от истинности условия condition переменной operation будут присвоены либо функция Add, либо Sub. Активизируется та функция, которая была присвоена переменной operation.
Таким образом, в вызовах функции и в операторах процедуры, кроме идентификаторов соответствующих подпрограмм могут быть имена переменных процедурных типов. Выполнение таких конструкций заключается в вызове подпрограмм, которые были присвоены этим переменным.