JavaScript のインスペクトで末尾再帰のループ展開
if (typeof Object.create !== 'function') { Object.create = function (o) { var F = function () {}; F.prototype = o; return new F(); }; } var thunk = { cookie: {} }; var make_thunk = function (func, args) { c = Object.create(thunk); c.force = function (cookie) { return func.apply(null, args); }; return c; }; var loop_ex = function (func) { var f = function () { if (f.caller && f.caller.caller && f.caller.caller.arguments[0] === thunk.cookie) { return make_thunk(func, arguments); } else { c = make_thunk(func, arguments); while (c.cookie === thunk.cookie) { c = c.force(thunk.cookie); } return c; } }; return f; }; var fact = function (n, acc) { if (n > 0) { return fact(n - 1, n * acc); } else { return acc; } }; fact = loop_ex(fact); document.writeln(fact(5, 1));
JavaScript: The Good Parts 流のオブジェクト指向のやりかたはこんな感じでいいのか?