Continuation
Continuationで中断した処理を再開します。
- 中断する場所で組み込み関数「callcc」を実行。
- ブロックに渡されるContinuationを記録
- 後でContinuation#callを実行すると、「callcc」を実行した位置に戻って処理を再開できます。
continuation = nil puts "start" i = callcc { |cont| # callccで現在の状態を記録 continuation = cont # ブロックの引数として渡されるContinuationを保存する puts "callcc" 0 # callccの戻り値はブロックの評価値。この場合、0 } puts i # continuation.callでcallccを実行した位置まで戻って処理を再開。 # continuation.callの引数が再開時のcallccの戻り値になる。 continuation.call(i+1) if i < 10
出力:
start callcc 0 1 2 3 4 5 6 7 8 9 10