#!perl use strict; use warnings; my $x = 1; sub lambda { my $fn = pop; my @argrefs = \(@_); sub { my @scopes= map { tempSet( $argrefs[$_], $_[$_] ) } 0..$#_; &$fn; } } my $y = 'Yval'; my $closure = lambda $x, $y => sub { "$x and $y" }; print $closure->($_, rand(3)), "(X=$x, Y=$y)\n" for (qw(a bitty china doll)); print "$x and $y\n"; # => 1 sub TempSet::DESTROY { shift(@_)->() } sub tempSet { my( $sv, $new )= @_; my $prior= $$sv; my $restore= bless sub { $$sv= $prior }, 'TempSet'; $$sv= $new; return $restore; }