perl - Perl 中的非本地返回(从调用者返回)

有没有办法让我我的来电者而不是我的来电者?例如

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 .

最佳答案

Continuation::Escape做你想要的。 Memoize然而,正如 Nikhil 指出的那样,这才是您真正需要的。

https://stackoverflow.com/questions/10372150/

相关文章:

perl - 在 Perl 中复制二维数组

php - 是否可以使用 PHP 添加事件监听器?

unix - 在 Solaris 上如何找到谁或哪个进程向我的进程发送了信号

r - 在 R 中从循环或 lapply 按名称调用列表

ms-access - 左外加入 Access ?

sql - Oracle CONNECT BY 分层查询中对父列的引用

powershell - 使用 Powershell 为 Word 文档添加页眉和页脚

maven - 你如何使用 Maven 设置 jetty-start?

r - 在每行中查找最小正值(不包括 0)

wpf - 从模板绑定(bind)到 View 模型的属性