Процедуры и функции

Процедуры и функции позволяют выделять повторяющиеся действия и вычисления в самостоятельные именованные подпрограммы. Они могут принимать параметры и вызываться с различными аргументами.

Процедура с параметрами

Параметры позволяют передавать процедуре данные при вызове.

procedure PrintSum(a,b: integer);
begin
  Println(a + b);
end;

begin
  PrintSum(3,5);
end.

Результат:

8

Параметры-переменные

Параметр с var позволяет процедуре изменять значение переданной переменной.

procedure Inc2(var x: integer);
begin
  x += 2;
end;

begin
  var a := 5;

  Inc2(a);

  Println(a);
end.

Результат:

7

Функция и Result

Возвращаемое значение функции задаётся с помощью переменной Result.

function Square(x: integer): integer;
begin
  Result := x * x;
end;

function SumArray(a: array of integer): integer;
begin
  Result := 0;
  foreach var x in a do
    Result += x;
end;

begin
  Println(Square(5));

  var a := [3, 8, 1, 6, 4];

  Println(SumArray(a));
end.

Результат:

25
22

Короткая функция

Если результат функции задаётся одним выражением, функцию можно записать в сокращённой форме.

function Square(x: real) := x * x;

begin
  Println(Square(5));
end.

Результат:

25

Оператор exit и досрочный выход из функции

Оператор exit позволяет сразу завершить функцию и вернуть найденное значение.

function IndexOf(a: array of integer; value: integer): integer;
begin
  for var i := 0 to a.Length - 1 do
    if a[i] = value then
      exit(i);
  exit(-1);
end;

begin
  var a := [3, 8, 1, 6, 4];

  Println(IndexOf(a,6));
  Println(IndexOf(a,10));
end.

Результат:

3
-1

Результат:

25

Параметры по умолчанию и именованные аргументы

Параметры могут иметь значения по умолчанию. Именованные аргументы позволяют явно указывать параметры при вызове и передавать их в произвольном порядке.

procedure PrintPerson(name: string; age: integer := 18; city: string := 'Москва');
begin
  Println(name, age, city);
end;

begin
  PrintPerson('Анна');
  PrintPerson('Борис', age := 20);
  PrintPerson('Вера', city := 'Ростов-на-Дону');
end.

Результат:

Анна 18 Москва
Борис 20 Москва
Вера 18 Ростов-на-Дону

Функция, возвращающая кортеж

Кортеж позволяет функции вернуть сразу несколько значений.

function MinMax(a,b: integer) :=
  if a < b then (a,b) else (b,a);

begin
  var (a,b) := ReadInteger2;
  var (min,max) := MinMax(a,b);

  Println(min,max);
end.

Если введены числа:

8 3

Результат:

3 8

Объект класса как параметр

Объекты классов передаются по ссылке, поэтому процедура может изменить поля переданного объекта.

type
  Person = auto class
    Name: string;
    Age: integer;
  end;

procedure IncAge(p: Person);
begin
  p.Age += 1;
end;

begin
  var p := new Person('Анна',21);

  IncAge(p);

  Println(p);
end.

Результат:

(Анна,22)

Обобщённая функция

Обобщённая функция может работать со значениями разных типов. Типовой параметр T определяется автоматически при вызове.

function First<T>(a: array of T): T;
begin
  Result := a[0];
end;

begin
  var a := [10, 20, 30];
  var s := ['red', 'green', 'blue'];

  Println(First(a));
  Println(First(s));
end.

Результат:

10
red