From: Shin-ichiro Hara Date: 1999-04-13T23:44:15+09:00 Subject: [ruby-list:13693] Re: What is callcc? (Re: iterator <-> cursor) 原です。 In message "[ruby-list:13688] What is callcc? (Re: iterator <-> cursor)" on 99/04/13, 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" } です。