Процедуры и функции в ТП используются для сокращения записи повторяющихся частей программы. Каждое объявление процедуры включает в себя заголовок и тело процедуры. Процедура вызывается с помощью оператора процедуры. Функции в ТП отличаются от процедур тем, что возвращают значение любого типа размером в 1, 2, 4 байта или типа String и вызываются внутри выражений.
Каждая процедура или функция в ТП должна быть объявлена в разделе объявлений процедур и функций перед ее вызовом, как было показано в параграфе 1.3.3.
Обявление_процедуры ::= заг_проц тело_проц ";".
В заголовке процедуры описывается имя процедуры и список формальных параметров:
Заг_проц ::= "procedure" ИД
["(" объявление_параметра
{";" объявление_параметра }")"] ";".
объявление_параметра::=["var" | "const"] список_ИД
[":" тип_параметра].
тип_параметра::= ИД_типа | "string" | "file" |
("array" "of" ИД_типа).
Тело_проц ::= ([("near" | "far" | "interrupt") ";"] (БЛОК | "forward"| "external" | блок_asm)) | директива_inline.
Тело процедуры содержит в себе либо блок объявлений и операторов (блок, см. параграф 1.3.3), либо блок программы на ассемблере (блок_asm), либо процедурные директивы, указывающие, что блок будет определен в другом месте программы (forward, external). Дополнительно могут использоваться директивы, определяющие некоторые внутренние свойства и область применения процедуры (near, far, interrupt).
Примеры объявления процедур:
procedure Exec(Path, CmdLine: string);
begin ... end;
procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);
{ TSearchRec - ранее определенный тип}
begin ... end;
procedure S(var T:real; const x: array of real);
begin ... end;
{$L my.obj}
procedure X(a:byte);external; {X - процедура на ассемблере в файле my.obj}
procedure Y(b:integer);forward; {предопределение процедуры Y}
procedure Z(c:longint);far;
begin ... end;
procedure Y(b:integer); {фактическое определение тела процедуры Y}
begin ... end;
Тело процедуры также может состоять только из директивы inline, которая является макроопределением на машинном коде.
Объявление функции отличается от объявления процедуры заголовком и невозможностью применения к телу функции директивы interrupt:
Заголовок_функции::= "function" ИД
["(" объявление_параметра
{";" объявление_параметра }")"] ":" ИД_типа ";".
Идентификатор типа, идущий за двоеточием, определяет тип значения, возвращаемого функцией.
Примеры объявления функций:
function Max(x,y:real):real; begin ... end;
function N(x,y:longint):string; asm ... end;
function D(a:byte):string; near; begin ... end;
function E(var S:string):byte; inline ( ... );
Функции в ТП отличаются от процедур тем, что возвращают некоторый результат и могут быть использованы в выражениях. В составном операторе тела функции должен быть хотя бы один оператор присваивания, слева от которого стоит ИД функции (см. параграф 1.3.3.2). Присваивание значения функции может производиться произвольное количество раз.
Пример:
function Max(x,y:real):real; {определение максимального из двух чисел}
begin
if x>y then
max:=x {присваивание результата функции}
else
max:=y; {присваивание результата функции}
end;
Функции не могут быть функциями обработки прерываний.