Sin * Cos или функция на функции сидит и функцией погоняет
Функции в PascalABC.NET - это объекты первого класса (дословный перевод с англ. first-class objects. Это значит, что функцию можно передавать как параметр в другую функцию и возвращать её как значение другой функции. Это - элементы функционального программирования, в котором функциями можно манипулировать так же как и обычными значениями.
Для иллюстрации мощности PascalABC.NET как функционального языка программирования определим функцию, являющуюся суперпозицикй двух функций f и g. Мы определим её как метод расширения, реализующий операцию умножения - так чтобы можно было писать f*g:
function operator*(f,g: real -> real): real -> real; extensionmethod := x -> f(g(x)); begin var fun := Sin * Cos; Println(fun(1)); Println((Cos * Sin)(1)); end.
0.514395258523549 0.666366745392881
Первое значение - это Sin(Cos(1)), а второе - Cos(Sin(1)).
Результат Sin * Cos мы сохранили в переменную fun. Нетрудно догадаться, что она получит тип real -> real. Результат Cos * Sin мы как функцию применили непосредственно к аргументу 1.
Заключение. Всё просто. PascalABC.NET - мощный функциональный язык, в котором функции - это объекты первого класса.