発信者に戻るのではなく、発信者から戻る方法はありますか? 例えば
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の外側に独自の行を作成するのではなく、関数にラップされる方法も気に入っています。