PascalABC.NET
November 9, 2022

Операции с процедурами

А можно сложить две процедуры? А умножить процедуру на число? В PascalABC.NET можно!

Рассмотрим следующие описания процедур:

procedure p1 := Write(1);
procedure p2 := Write(2);
procedure ln := Writeln;

Если говорить просто, то при сложении процедур получается процедура, состоящая в их последовательном вызове. А умножение процедуры на целое число n - это процедура, вызывающая указанную процедуру n раз.

Чтобы вызвать такие комбинированные процедуры, достаточно их выражения взять в скобки. Например, такая программа

begin
  (p1+p2+ln);
  (p2+p1+ln);
  (p1*10+p2*10+ln);
  ((p1+p2)*10+ln);
end.

выведет:

12
21
11111111112222222222
12121212121212121212

Это очень эффективно и позволяет в подобных простых случаях не использовать циклы!

А нельзя ли складывать и умножать на число процедуры с параметрами - спросите вы? Тоже можно! Только это должны быть функции, которые возвращают процедуры без параметров! Всё просто :) Приведем пример.

Вот такая программа

##
function f(n: integer): procedure := ()->Write(n);

(f(7)*5+f(3)*5);

выведет

7777733333

Нетрудно видеть, что чтобы вернуть из функции процедуру, мы возвращаем её в виде лямбда-выражения.

Приведем скриншот полной итоговой программы:

Заключение. Парадоксально, но мысль об использовании операций с процедурами возникла у школьников, которых мы учили процедурам и которые ленились писать циклы :) А теперь - это целая особенность языка PascalABC.NET. Или фича как говорят молодые :)