Closures, Higher-Order Functions and Functional Perl
Book: *Higher-Order Perl* by Mark Jason Dominus (free online): the classic text on functional Perl.
use v5.36;
# Closures capture lexical variables
sub make_counter($start = 0) {
my $count = $start;
return {
inc => sub { ++$count },
dec => sub { --$count },
value => sub { $count },
};
}
my $c = make_counter(10);
$c->{inc}->() for 1..3;
say $c->{value}->(); # 13
# Function factories
sub multiplier($factor) { return sub ($x) { $x * $factor } }
my $triple = multiplier(3);
say $triple->(7); # 21
# Function composition
sub compose(@fns) {
return sub (@args) {
@args = $_->(@args) for reverse @fns;
return wantarray ? @args : $args[0];
};
}
my $inc_then_double = compose(sub { $_[0] * 2 }, sub { $_[0] + 1 });
say $inc_then_double->(5); # 12
# Currying
sub curry($f, @pre) { sub (@rest) { $f->(@pre, @rest) } }
my $add = sub ($x, $y) { $x + $y };
my $add5 = curry($add, 5);
say $add5->(10); # 15
# Memoization
use Memoize;
sub fib($n) { $n < 2 ? $n : fib($n - 1) + fib($n - 2) }
memoize('fib');
say fib(80);
# Iterators and generators via closures
sub make_iter(@items) {
my $i = 0;
return sub { return $i < @items ? $items[$i++] : () };
}
my $it = make
…