The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/env perl
# Copyright (c) 2015 Christian Jaeger, copying@christianjaeger.ch
# This is free software. See the file COPYING.md that came bundled
# with this file.
use strict;
use warnings FATAL => 'uninitialized';
use Scalar::Util "weaken";
sub foo {
my $f;
$f = sub {
my ($n) = @_;
my $f = $f; # create a new, strong binding for f to prevent it
# from being freed (upon return from f)
sub {
if ($n > 0) {
$n + &{ &$f($n - 1) }
} else {
0
}
}
};
my $f_ = $f;
weaken $f;
&$f_;
}
my $res = &{ foo 2 };
print $res, "\n";