callcc
callcc(call-with-current-continuation)の話。
callccは、実際のプログラムのどういう局面で使用するのがいいのだろう。ということで以下のようなサンプルを書いてみた。main()で例外が発生したら、もう一度最初からやり直している。グローバル変数とかは再初期化されないんで、実際にはその辺の再初期化も考慮してあげる必要がある。
#!/usr/bin/env ruby def main raise 'error!!' end $start = nil callcc {|c| $start = c } begin main rescue Exception => ex puts ex $start.call end
このサンプルは、インタラクティブな処理を行うプログラムで、何かエラーが発生したんだけどプログラムは終了せずに、やっぱりもう一度最初から処理を行うような状況を想定している。やっぱりRubyだったら普通retryを使って実装するような気もするな。
callccではスタックが深くなる方向にもジャンプできるんだけど、これはどういう局面で使うのかな。この機能はプログラマに自制心がないと簡単にスパゲッティ状態に陥りそうだ。取り扱い注意だ。
参照: プログラミング言語 Ruby リファレンスマニュアル