Операции с процедурами
А можно сложить две процедуры? А умножить процедуру на число? В 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. Или фича как говорят молодые :)