トランポリン
trampoline
T -> A が呼ばれている最中に T に戻って B を呼びなおす、
という感じです。
(Slackより)
「一般には、関数func1から関数func2を直接呼べない場合に 「func2を呼ぶという継続」をスタックにプッシュして、 func1から一度抜けるテクニックを「トランポリン」と呼ぶ。 func1の呼び出し元は、戻って来て欲しい場所を継続として スタックに置いておいたのだが、func1はその上に 一段ジャンプするクッションを噛ませて、あたかもトランポリンの上で跳ねるようにして func2へと制御を移すわけだ。func2からのreturnは もともとスタックにあった継続、すなわちfunc1の呼び出し元が置いた継続へと 制御を移す。呼び出し元から見れば、あたかもfunc1から直接返ってきたように 見える。」 code:javascript
function repeat(operation, num) {
return function() {
if (num <= 0) return
operation()
return repeat(operation, --num)
}
}
function trampoline(fn) {
while(fn && typeof fn === 'function') {
fn = fn()
}
}
module.exports = function(operation, num) {
trampoline(function() {
return repeat(operation, num)
})
}
The trampoline is just a technique to optimize recursion and prevent stack-overflow exceptions in languages that don't support tail call optimization like Javascript ES5 implementation and C#. However, ES6 will probably have support for tail call optimization.