有没有办法让我从打电话的人那里回来,而不是打电话的人呢?例如:
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'));但这是额外的噪音,也没有考虑到上下文。)
编辑:对那些合理建议追忆的人来说-是的,我应该说,我很了解这个模块。我正在编写一个基于志志的更现代、更有特色的回忆录版本。
但是与这个问题有关的是,在某些情况下,从功能内部而不是在功能之外回忆录是有用的(回忆录只做后一种功能)。它使自定义缓存键和/或确定是否要对此特定调用进行回忆录变得非常容易。例如:
sub complex_function {
my $key = ...; # normalize arguments
if (...) { # is it worth memoizing in this case?
memoize_self({key => $key});
}
}我还喜欢它封装在函数中的方式,而不是在外部创建自己的行ala 状态变量。
发布于 2012-04-29 12:57:17
看看CPAN模块追忆 --用时间交换空间使函数更快,这可能会解决您的问题。
发布于 2012-04-29 14:35:05
“有什么办法让我从打电话的人那里回来,而不是打电话的人呢?”
是的,有几个。
goto向后跳。见perldoc -f goto。eval和die进行更多的控制跳转。见perldoc -f eval和perldoc -f die。goto它。当您这样做,它将返回到与goto调用者的子。见perldoc -f goto。当然,大多数人会告诉您重写所有东西以避免gotos,并使维护代码的人的生活变得更容易,但是他们为您做了什么呢?
https://stackoverflow.com/questions/10372150
复制相似问题