【发布时间】:2021-02-23 14:48:07
【问题描述】:
有没有办法让我返回 from 我的调用者而不是 to 我的调用者?例如
sub foo {
bar();
# this never gets executed
}
sub bar {
return_from_caller(5);
}
# This prints 5
print foo();
(基本原理:我正在编写一个函数 memoize_self,它从函数本身中记住一个函数。我希望它像这样工作:
sub complex_function {
my ($x, $y) = @_;
memoize_self({key => $y, expires_in => '5min'));
# compute $result
return $result;
}
memoize_self 将检查其缓存,如果命中,则返回其调用者 的缓存值。否则,它将重新调用函数(使用动态范围的 var 以避免明显的无限循环),将返回值存储在缓存中并再次返回。
如果没有从调用者返回的能力,我可能会使用 $_ 并这样写:
return $_ if memoize_self({key => $y, expires_in => '5min'));
但这是额外的噪音,也没有考虑上下文。)
编辑:对于合理建议 Memoize 的人 - 是的,我应该说,我很了解这个模块。我正在编写一个基于CHI 的更现代、更有特色的 Memoize 版本。
但就这个问题而言,在某些情况下,从函数内部而不是函数外部进行记忆是有用的(Memoize 只做后者)。它可以很容易地自定义缓存键和/或确定是否要为这个特定的调用进行记忆。例如
sub complex_function {
my $key = ...; # normalize arguments
if (...) { # is it worth memoizing in this case?
memoize_self({key => $key});
}
}
我也喜欢它被包裹在函数中的方式,而不是在外面创建自己的行,ala state variables。
【问题讨论】:
-
相关:COMEFROM (:
-
这种non-local return 可以用CPS 但在perl 中很尴尬。
标签: perl