Описания функций
Описание функции определяет часть программы, в которой вы- числяются и возвращается значение.
---------- ---- -------- ---- описание --->¦заголовок+-->¦ ; +-->¦ тело +-->¦ ; +--> функции ¦ функции ¦ L---- ¦функции¦ L---- L---------- L--------
--------- -------------- заголовок --->¦function+T>¦идентификатор+--T------------------- функции L---------¦ L--------------^ ¦ ----------- ^ ¦ ¦ --------------¦ ¦ ¦список ¦ ¦ ¦ L>¦ уточненный +- L->¦формальных+--- ¦ ¦идентификатор¦ ¦параметров¦ ¦ ¦ метода ¦ L----------- ¦ L------------------------------------- ¦ ---- --------- L->¦ : +-->¦тип ре- +--> L---- ¦зультата¦ L--------- -------------- тип результата --T-->¦идентификатор+---------> ¦ ¦ типа ¦ ^ ¦ L-------------- ¦ ¦ ------- ¦ L----->¦string+---------- L-------
Примечание: Функция не может возвращать процедурный тип или структурный тип.
В заголовке функции определяется идентификатор функции, фор- мальные параметры (если они имеются) и тип результата функции.
Функция активизируется при вызове функции. При вызове функ- ции указывается идентификатор функции и какие-либо параметры, не- обходимые для вычисления функции. Вызов функции может включаться в выражения в качестве операнда. Когда выражение вычисляется, функция выполняется и значением операнда становится значение, возвращаемое функцией.
В операторной части блока функции задаются операторы, кото- рые должны выполняться при активизации функции. В модуле должен содержаться по крайней мере один оператор присваивания, в котором идентификатору функции присваивается значение. Результатом функ- ции является последнее присвоенное значение. Если такой оператор присваивания отсутствует или он не был выполнен, то значение, возвращаемое функцией, не определено.
Если идентификатор функции используется при вызове функции внутри модуля-функции, то функция выполняется рекурсивно.
Приведем далее примеры описаний функции:
function Max(a: Vector; n: integer): extended; var x: extended; i: integer; begin x := a(1); for i := 2 to n do if x < a[i] then x := a[i]; Max := x; end;
function Power(x: extended; y: integer): extended; var z: extended; i: integer; begin z := 1.0; i := y; while i > 0 do begin if Odd(i) then z := z*x; x := Sqr(x); end; Power := z; end;
Аналогично процедурам функции могут описываться, как с ближ- ним типом вызова (near), с дальним типом вызова (far), опережаю- щие (forward), внешние (external), ассемблерные (assembler) или подставляемые (inline). Однако функции прерываний (interrupt) не допускаются.