Привет,
в этом посте я расскажу рецепт добавления функциональности в Перл.
Как уже стало понятно из названия, мы будем вычислять рекуррентные соотношения.
Например, формулы для вычисления факториала выглядят вот так:
f(0) = 1
f(n) = n * f(n-1)
Функциональные языки программирования позволяют определять такие функции достаточно просто, в Erlang это делается следующим образом:
factorial(0) ->
1;
factorial(N) ->
N * factorial(N-1).
А теперь попробуем сделать нечто похожее, что позволяло бы нам писать код вида:
#!/usr/bin/perl -I./lib
use strict;
use bigint;
use Recurrent;
recurrent fac => {
arg(0) => lambda { my($n) = @_; return 1 },
arg(n) => lambda { my($n) = @_; return $n * fac($n-1) },
};
print fac(100);
Из примера видно, что у нас появились новые функции recurrent, arg, n и lambda. На самом деле, практическая польза есть только у recurrent, все остальные нужны лишь для получения более «красивого» кода.
Давайте напишем модуль Recurrent.pm