Well, you could declare $x within the call to lambda, instead of surrounding it:
#!perl
use strict;
use warnings;
sub lambda {
my $fn = pop;
my @foo = @_; # foo references $x, etc.
sub {
# Put values into referenced params
${$foo[$_]} = $_[$_] for 0..$#_;
&$fn;
}
}
my $x = 3;
my $closure = lambda do {
my ($x, $y);
\($x, $y) => sub { print "Got $x and $y\n" }
} ;
$closure->($_, $_+1) for (1..4);
print "And my X is $x\n";
Though I suspect that's a distinction that won't be seen as advantageous. It's just as easy to write
my $closure = sub {
my ($x, $y) = @_;
print "Got $x and $y\n";
};
which is the Perlish way to do what the OP wants to do.
Caution: Contents may have been coded under pressure.
|