From: Daniel DeLorme Date: 2008-09-30T09:10:39+09:00 Subject: Re: ruby1.9 block scope Nobuyoshi Nakada wrote: > > At Tue, 30 Sep 2008 00:23:17 +0900, > Daniel DeLorme wrote in [ruby-talk:316347]: >>> My vague idea for the issue is that when you see the reference to a >>> local variable inside of the block, the scope of the variable would be >>> upgraded to the level of the reference. >> Do you mean upgrade the scope of the variable dynamically? Is that even >> possible? I thought that all local vars had their scope pretty much set >> in stone at the lexical level. But if you could upgrade their scoping >> level dynamically... that would be nifty indeed! > > I guess the parser would do it at the compile time. That was also my guess; it least it's an easy concept to imagine. But it does bring the question of what to do when you *don't* want variables to "escape" into the enclosing scope? e.g. class Foo defined_method :bar do x = 1 #I don't want x to be defined in the Foo scope end defined_method :baz do x = 2 #because it would wind up shared with this method end end The best I could think of was that a variable shouldn't be upgraded if the enclosing scope is a "class" or "module" section. That can be detected at parse time so it would work with lexical binding. But it would be very interesting indeed if you could bind a block's variables to the enclosing scope dynamically. You could say: block.call_using_enclosing_scope #e.g. define_method block.call_using_own_scope #e.g. each To me that feels very very powerful. And more power to the programmer is good, right? ;-) -- Daniel