Hi Matz,

this seems consistent if you think of block parameters as well as block
local parameters as merely being a call by name closure of the surrounding
context.   If the block parameters and block local variables are not
referred
to by name in the enclosing local context, after as well as before the block
expression then these block parameters and local variables are local to
the block only.

In other words block parameters and block locals are in block scope
unless they are defined as local to the context the block closure sees both
before and after the block expression.

I have another request and since I've only been programming in Ruby under
a week it might be a dumb request.  If there are way to exit a block used
in conjunction with an iterator/enumerator?  In other words is there a way
to break out of the loop:

        [1,2,3].each { | i | print "\n#{i}"; break if (i >= 2) }

which would produce:

    1
    2

John
p.s.  I got a good chunk of that Ruby ODBC driver finished over the weekend
but I'm not pulled off working on a rush job in Perl.

----- Original Message -----
From: "Yukihiro Matsumoto" <matz / zetabits.com>
To: "ruby-talk ML" <ruby-talk / netlab.co.jp>
Sent: Tuesday, October 24, 2000 10:59 AM
Subject: [ruby-talk:5819] Re: local variables (nested, in-block, parameters,
etc.)


> Hi,
>
> In message "[ruby-talk:5818] Re: local variables (nested, in-block,
parameters, etc.)"
>     on 00/10/24, ts <decoux / moulon.inra.fr> writes:
>
> |G> So, does this amount to it *creating* a local var to bind to if no
local
> |G> var already exists?  GREAT idea. And I don't think it would cause much
> |G> incompatibility since if no local var was seen, then it probably isn't
> |G> used later, either (or if it is, is probably initialized). The only
> |
> | It break some closure, for example in test.rb
> |
> |   eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
> |   test_ok($x[4].call == 8)
>
> I'm thinking of adding a new rule that the scope of a new block
> parameter (|| variable) is extended if it is referred out of the
> block.  So i5 in
>
> >   eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
> >   test_ok($x[4].call == 8)
>
> will be in-block variable (as is now).  But i6 in
>
>   [1,2,3].each{|i6| break if i6 % 2 == 0}
>   p i6    # referred out of a block
>
> will be a plain local variable.  How do you think?
> Too complicated?
>
> matz.
>