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

Jon*_*rtz 1 perl

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

sub foo {
    bar();
    # this never gets executed
}

sub bar {
    return_from_caller(5);
}

# This prints 5
print foo();
Run Code Online (Sandbox Code Playgroud)

(理由:我正在编写一个函数memoize_self,它在函数本身内记忆一个函数.我希望它能像这样工作:

sub complex_function {
    my ($x, $y) = @_;
    memoize_self({key => $y, expires_in => '5min'));
    # compute $result
    return $result;
}
Run Code Online (Sandbox Code Playgroud)

memoize_self将检查自己的缓存,如果它得到一击,返回缓存值它的调用者.否则,它将重新调用该函数(使用动态范围的var来避免明显的无限循环),将返回值存储在缓存中并再次返回它.

如果没有从调用者返回的能力,我可能会使用$ _并以这种方式编写它:

return $_ if memoize_self({key => $y, expires_in => '5min'));
Run Code Online (Sandbox Code Playgroud)

但这是额外的噪音,也没有考虑上下文.)

编辑:对合理建议Memoize的人 - 是的,我应该说,我很了解这个模块.我正在编写一个基于CHI的更现代和功能更强的Memoize版本.

但作为涉及到这个问题,有些情况下是非常有用的,以memoize的案件的作用,而不是外界的功能(memoize的只做后者).它可以轻松自定义缓存键和/或确定是否要为此特定调用进行任何记忆.例如

sub complex_function {
    my $key = ...;   # normalize arguments
    if (...) {       # is it worth memoizing in this case?
        memoize_self({key => $key});
    }
}
Run Code Online (Sandbox Code Playgroud)

我也喜欢它在函数中被包裹的方式而不是在外面创建自己的行,ala 状态变量.

Han*_*Lub 6

Continuation :: Escape完全符合您的要求.然而,正如Nikhil指出的那样,Memoize就是你真正需要的东西.