From: shugo@... (Shugo Maeda) Date: 1999-01-08T15:40:24+09:00 Subject: [ruby-list:11512] Re: call/cc 前田です。 # ruby-devに振ります。 kjana@os.xaxon.ne.jp (YANAGAWA Kazuhisa) writes: > guile> (define call/cc call-with-current-continuation) > guile> (define foo #t) > guile> (begin > (write 1) > (write 2) > (call/cc (lambda (c) (set! foo c))) > (write 3) > (write 4)) > 1234guile> foo > # > guile> (foo #t) > 34guile> これが無限ループにならないのはどういう仕組なんでしょう。 # すいません、ほんとにScheme全然知らないので。 (begin (begin (write 1) (write 2) (call/cc (lambda (c) (set! foo c))) (write 3) (write 4)) (foo #t)) だと無限ループに陥いるのでトップレベルだけ特別なのかな。 Rubyだと、 foo = true begin print 1 print 2 call_cc { |c| foo = c } print 3 print 4 end foo.call(true) みたいにイテレータにするのがよさそうですね。 def bar(c); $foo = c; end call_cc(&method(:bar)) みたいにメソッドも渡せますし。 上のコードが無限ループになってもよいなら実装はそんなに大変じゃなさそう。 -- 前田 修吾