Язык:
Русский
English
Процедурные типы
Стандартный Pascal обрабатывает процедуры и функции только как части программы, которые могут быть выполнены через обращение к процедуре или функции.
Borland Pascal имеет намного более широкую область применения процедур и функций. С помощью процедурных типов можно расценивать процедуры и функции как объекты, которые могут быть назначены переменным и переданы как параметры.
Объявление процедурного типа содержит параметры и, для функции, тип результата.
Синтаксис объявления процедурного типа идентичен заголовку процедуры или функции, за исключением того, что можно опускать идентификаторы после ключевого слова procedure или function.
Примеры
type Proc = procedure;
SwapProc = procedure(var X, Y : Integer);
StrProc = procedure(S : String);
MathFunc = function(X : Real) : Real;
DeviceFunc = function(var F : Text) : Integer;
MaxFunc = function(A, B : Real; F : MathFunc) : Real;
Имена параметров в объявлении процедурного типа не влияют на значение объявления.
Borland Pascal не позволяет вам объявлять функции, которые возвращают значения процедурного типа.
Результат функции должен иметь тип String, Real, Integer, Char, Boolean, Pointer или определённый пользователем перечислимый тип.
Ада
Процедурному типу соответствуют типы доступа к процедуре/функции:
type Proc is access procedure;
type Swap_Proc is access procedure (X, Y : in out Integer);
type Str_Proc is access procedure (S : String);
Особенный интерес представляют нисходящие замыкания - естественное развитие идей Паскаля:
function Max_Func (A, B : Float;
F : not null access function (X : Float) return Float)
return Float;
В Borland Pascal процедурные типы не могут указывать на вложенные функции и процедуры. Вложенные процедуры - это отличительная особенность Паскаля, но, как и некоторые другие особенности, полноценно использовать их стало возможно только в языке Ада, где мешавшие ограничения были сняты.
Преимущество вложенной функции в том, что она может обращаться ко всем локальным переменным, прозрачно для программиста:
function Math_Fun (A, B : Float; Pow : Natural) return Float is
function Pow_Fun (X : Float) return Float is
begin
return X**Pow;
end Pow_Fun;
begin
return Max_Func (A, B, Pow_Fun'Access);
end Math_Fun;
В большинстве других языков программирования требуется рядом с замыканием определять структуру (запись), копировать в эту структуру все данные, к которым будет обращаться нисходящее замыкание, и передавать указатель на эти данные как дополнительный параметр. В языке Ада передаётся указатель на нужный кадр стека, и замыкание легко находит всю требуемую информацию (например, значение Pow).
Нисходящие замыкания (downwards closure) иногда называют процедурами обратного вызова (callback).