From: Rodrigo Rosenfeld Rosas Date: 2011-12-20T08:04:47+09:00 Subject: [ruby-core:41734] Re: Documentation of the language itself (syntax, meanings, etc) Em 19-12-2011 19:38, Eric Hodel escreveu: > On Dec 15, 2011, at 7:39 PM, Rodrigo Rosenfeld Rosas wrote: >> Yeah, I already knew about all this. What I'm asking is why Ruby won't allow me to return from another method, ie, passing procs between different methods that will allow me to return from any method through that proc... >> >> I would like to know the reasoning behind this design decision... Is it just difficult technically to implement such behavior, or is it undesired? For the latter case, I would like to know why it is undesired... > Continuations allow you to arbitrarily unwind the stack, but you probably want to avoid using them because they're tricky to use correctly: > > $ cat t.rb > require 'continuation' > > def a > b > puts 'a done' > end > > def b > c > puts 'b done' > end > > def c > d > $cont.call if $cont > puts 'c done' > end > > def d > puts 'd done' > end > > puts 'without continuation:' > > a > > puts > puts 'back at toplevel' > > puts > puts 'with continuation:' > > callcc do |cc| > $cont = cc > > a > end > > puts > puts 'back at top-level' > > $ ruby t.rb > without continuation: > d done > c done > b done > a done > > back at toplevel > > with continuation: > d done > > back at toplevel Using global variables ($cont) in multi-threaded web servers is impractical, so it wouldn't work for what I'm looking for. In the other hand, catch-throw could work, but I would depend on the propose being accepted by the web framework being used, or maintaining some monkey patch myself, which I don't think would worth the extra "return"s saved. But don't get me wrong, I'm not insisting that Ruby should add support for such a feature. Actually, I've never asked for it, I was just wondering what are the reasons why this isn't supported by Ruby, but it was already pointed out to me that it could make code debugging very hard, which I agree... I hope web frameworks will provide such feature by using some catch-throw implementation some day. Thanks, Rodrigo.