cps スタイルの関数も処理できる一般的な「メモ化」関数 (関数を入力として、関数を出力として、Python のデコレータとして) を実装する方法があるかどうか疑問に思っています。
通常の関数の場合 (「結果の値はリターンによって返されます。パラメーターは入力専用です!」のように) memoize 関数は (javascript で) のように単純にすることができます。
function memoize(fun) {
var cache = {};
return function () {
var args = Array.prototype.slice.call(arguments);
if (args in cache)
return cache[args];
var ret = fun.apply(this, arguments);
cache[args] = ret;
return ret;
};
}
しかし、cps スタイルの関数は単純な関数ではメモ化できません。memoize
関数型の引数を「再度」評価する必要があり、それらに渡すパラメーターも知っているからです。
たとえば、次の関数が与えられた場合
function cps(param, next) {
var ret = param + 1;
// setTimeout for simulate async behaviour
setTimeout(function () {
next(ret);
}, 0);
}
多分私はそれが関数であることを見つけることnext
ができますが、その署名(まあ...多分、しかしそれはトリッキーです)であり、間違いなく関数で使用されるパラメーターではありません!
誰かが私が間違っていると言うことができますか? :D
半ダースの cps スタイルの関数をメモできることに興味があり、それらのすべてに「キャッシュ」を挿入するロジックを台無しにしたくありません。