28 lines
515 B
Plaintext
28 lines
515 B
Plaintext
|
|
|
|
###
|
|
### memoize-normalize4
|
|
###
|
|
|
|
## Chapter 3 section 7
|
|
|
|
sub memoize {
|
|
my ($func, $keygen) = @_;
|
|
my $keyfunc;
|
|
if ($keygen eq '') {
|
|
$keygen = q{join ',', @_}
|
|
} elsif (UNIVERSAL::isa($keygen, 'CODE')) {
|
|
$keyfunc = $keygen;
|
|
$keygen = q{$keyfunc->(@_)};
|
|
}
|
|
my %cache;
|
|
my $newcode = q{
|
|
sub { my $key = do { KEYGEN };
|
|
$cache{$key} = $func->(@_) unless exists $cache{$key};
|
|
return $cache{$key};
|
|
}
|
|
};
|
|
$newcode =~ s/KEYGEN/$keygen/g;
|
|
return eval $newcode;
|
|
}
|