On Mon, Nov 24, 2003 at 06:34:49AM +0900, T. Onoma wrote:
> On Sunday 23 November 2003 10:04 pm, Mauricio Fern?ndez wrote:
> > On Mon, Nov 24, 2003 at 05:32:09AM +0900, Mathieu Bouchard wrote:
> > > I think the actual problem would be more with code that does things like
> > > this:
> > >
> > > def foo(n)
> > >   (0...n).map {
> > >     proc {a=0; proc{a+=1;a}}[]
> > >   }
> > > end
> >
> > This would work with the new rules (and the current ones), I believe:
> >
> > def foo(n)
> >   (0...n).map { proc {|a| proc{ a += 1; a } }[0] }
> > end
> >
> actually using
> 
>   foo(3).each { |q| p q.call } 
> 
> they both produce
> 
>   1
>   1
>   1

This is the behavior matju wanted (n independent counters). It works in
1.x because the block argument is local unless it was already in use in
the outer scope, and will in 2.0 because block args will *always* be
local.

> but in both, if you add a=0:
> 
>   def foo(n)
>     a = 0
>     (0...n).map { proc {|a| proc{ a += 1; a } }[0] }
>   end
> 
> then
> 
>   1
>   2
>   3

a exists in the method scope, so it's not block local in this case (for
1.x)

> So you tell me how it changes in new system, cause I don't know. i'm
> guessing the first won't be 1 1 1 anymore. but who am i to say? i find the 
> examples confusing enough in themselves :).

In 2.0, you'd get 1 1 1 in the second case, and a warning ("shadowing is evil" or such :-),
if I understood correctly matz's latest statements on the matter.

Note that this could also be written as 

def foo(n); (0..n).map{ local{|a| a = 0; proc{ a+= 1; a} } }

with
 def local
   yield
 end

I'd really like to try :=, 
def foo(n); (0..n).map{ a:= 0; proc{ a+=1; a } }

but it seems that matz has definitely abandoned the idea :-(

-- 
 _           _                             
| |__   __ _| |_ ___ _ __ ___   __ _ _ __  
| '_ \ / _` | __/ __| '_ ` _ \ / _` | '_ \ 
| |_) | (_| | |_\__ \ | | | | | (_| | | | |
|_.__/ \__,_|\__|___/_| |_| |_|\__,_|_| |_|
	Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

<miguel> any new sendmail hole I have to fix before going on vacations?
	-- Seen on #Linux