原です。
In message "[ruby-list:13688] What is callcc? (Re: iterator <-> cursor)"
on 99/04/13, toyofuku / juice.or.jp <toyofuku / juice.or.jp> writes:
|
| 豊福@パパイヤです。
|
|> class Cursor
|> def initialize(iter)
|> @iter = iter
|> @cont = nil
|> end
|>
|> def next
|> @cont.call if @cont
|> @iter.call {|obj|
|> callcc{|@cont| return obj }
|> }
|> nil
|> end
|> end
|
| callcc の話はときどき目にしてきましたし、この例の意味もわかる
|ような気もするのですが callcc のはっきりした仕様を未だに知りません。
|この際だから聞いておきましょう。
|
| callcc って何ですか。
私が答えるのも何なんですが、、、、
|この例の
|・|@cont| に渡されるものは何ですか。
これが「継続」ってやつですね。
|・ / cont.call では何が起きますか。
「継続」を継続します。(^^; もう少し言うと
callcc { |cont| .... }
を実行すると、callcc の直前の状態(変数の割り当てとかループ
カウンタとか。オブジェクトの状態ではない。)を記憶して cont
に代入し、.... を実行します。cont の指しているこのオブジェク
トは Continuation クラスのインスタンスであり、これに .call(x)
すると x を callcc の返り値として、先に記憶した状態を復元し、
callcc の後に実行が移ります。
で、いいのかなあ。
無限ループを作るとこんな感じ、
def Loop
callcc {|c| $c = c }
yield
$c.call
end
Loop { print "hello\n" }
です。