前田です。

At Tue, 27 Jul 1999 12:29:41 +0900,
石塚圭樹 <keiju / Rational.Com> wrote:
> callccで渡されるContinuationは代入しないと意味がないのに, 今の仕様だと代
> 入がなんか技巧的なんですよね...
> 
> callcc{|$cc|...}

私はこういうのは嫌なので、

callcc{|c| $cont = c; ...}

とします。

代入しないと意味がないということはなくて、

callcc {|c| .... c.call(obj) ... }

みたいなcatch/throw的な使い方もありますよね。
Schemeでは、もともとはこちらの用途のために使られたものなのではな
いでしょうか。
# むかしはcall/ccじゃなくてcatchという名前だったらしいですし。

> >というのも考えたのですが、callした時にContinuation.newの返り値が
> >(Continuationではない)objになったりするのはちょっと変ですよね。
> 
> 変と言うかないときっとまずいんでしょ? きっと,
> 
> cc = nil
> if callcc{|cc| true}
> ...
> 
> cc.call{false}
> 
> 見たいなことしたいんですよね?

if c = Continuation.new
...

c.call(false)

というのは技術的には可能ですけど気持わるいですよね。

> >たしかにRubyでは大域脱出にcall/ccを使う必要はないので、イテレータ
> >にしているのはちょっとムダな感じはしますけど、代案が思いつかなかっ
> >たのでこのようにしました。
> 
> ということは上記みたいな使い方はしないのかな?

イタレータブロック内でContinuation#callを呼ばない(つまり大域脱出
に使わない)のなら、イタレータにする必然性はないと思います。
きれいなインタフェイスが思いつきませんが。

-- 
前田 修吾