Переменной процедурного типа можно присвоить процедурное
значение. Процедурные значения могут быть следующими:
* значениями nil;
* ссылкой на переменную процедурного типа;
* идентификатором процедуры или функции.
В контексте процедурных значений описание процедуры или
функции можно рассматривать как специальный вид описаний конс-
тант, когда значением константы является процедура или функция.
Рассмотрим, например, следующее описание:
var
P: SwapProc;
F: MathFunc;
procedure Swap(var A, B: Integer); far;
var
Temp: Integer;
begin
Temp := A;
A := B;
B := Temp;
end;
function Tan(Angle: Real); far;
begin
Tan := Sin(Angle) / Cos(Angle);
end;
Переменным P и F можно присвоить значения следующим образом:
P := Swap;
F := Tan;
а вызовы с помощью P и F можно выполнить так:
P(I, J); { эквивалентно Swap(I, J) }
X := F(X); { эквивалентно X := Tan(X) }
Использование процедурных переменных, которым в операторе
вызова процедуры или функции присваивается значение nil, приводит
к ошибке. Значение nil предназначено для указания того, что про-
цедурная переменная не присвоена, и, так где процедурная перемен-
ная может получить значение nil, участвующие в этой процедурной
переменной вызовы процедур и функций следует подвергать проверке:
if @P <> nil then P(I, J);
Обратите внимание на использование операции @ для указания
того, что P проверяется, а не вызывается.