Deklaracje funkcji


Deklaracja funkcji jest taka sama jak deklaracja procedury z wyjątkiem specyfikacji typu rezultatu. Deklaracja posiada postać:

function NazwaFunkcji(ListaParametrow): TypRezultatu; dyrektywy;
LokalneDeklaracje;
begin
  Instrukcje
end;

gdzie:  NazwaFunkcji jest poprawnym identyfikatorem, TypRezultatu jest identyfikatorem typu, Instrukcje są sekwencją instrukcji wykonywaną podczas wywołania funkcji; (ListaParametrow), dyrektywy i LokalneDeklaracje są opcjonalne.

Zasady posługiwania się identyfikatorami wewnątrz funkcji są takie same jak w przypadku procedury. Dodatkowo, nazwa funkcji działa jak specjalna zmienna, która przechowuje wartość zwracaną przez funkcję. Zamiast niej można używać predefiniowanego identyfikatora Result.

Na przykład:

function WF: Integer;
begin
  WF := 17;
end;

definiuje bezparametrową funkcję o nazwie WF, zwracającą wartość całkowitą: 17. Jest to równoznaczne z deklaracją:

function WF: Integer;
begin
  Result := 17;
end;

Bardziej złożony przykład:

function Max(A: array of Real; N: Integer): Real;
var
  X: Real;
  I: Integer;
begin
  X := A[0];
  for I := 1 to N - 1 do
    if X < A[I] then X := A[I];
  Max := X;
end;

Można wielokrotnie przypisywać różne wartości do identyfikatora Result lub do nazwy funkcji. Kiedy wykonanie funkcji kończy się, ostatnia wartość przypisana do Result lub do nazwy funkcji zostanie zwrócona jako wartość funkcji. Przykład:

function Power(X: Real; Y: Integer): Real;
var
  I: Integer;
begin
  Result := 1.0;
  I := Y;
  while I > 0 do
  begin
    if Odd(I) then Result := Result * X;
    I := I div 2;
    X := Sqr(X);
  end;
end;

Result i nazwa funkcji zawsze reprezentują tę samą wartość. Dlatego funkcja:

function MyFunction: Integer;
begin
  MyFunction := 5;
  Result := Result * 2;
  MyFunction := Result + 1;
end;

zwraca wartość 11. Jednak identyfikator Result nie jest w pełni równoważny z nazwą funkcji. Jeśli nazwa funkcji pojawi się z lewej strony instrukcji przypisania, kompilator interpretuje to jako wskazanie nowej wartości zwracanej przez funkcję, jeśli nazwa funkcji wystąpi w jakimkolwiek innym miejscu, kompilator zinterpretuje to jako rekurencyjne wywołanie tej samej funkcji. W odróżnieniu, identyfikator Result w dowolnym przypadku może być używany jak zwykła zmienna.

Nie wolno redeklarować identyfikatora Result.