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
…