I understand the behavior, but I don't understand the *rationale* for
the behavior.
Is the existence of {|x,| } intentional, or a parsing artifact? I can
fully understand the behavior of {|x,y| } in both block and lambda
context, but {|x,| } behaves rather strangely (as you documented).
So again, is {|x,| } intentional?
-- Yehuda
On Feb 13, 2008, at 9:57 PM, Tanaka Akira wrote:
> In article <47B3990A.9020709 / dan42.com>,
> Daniel DeLorme <dan-ml / dan42.com> writes:
>
>> So I think it has to do with blocks using multiple-assignment
>> semantics
>> and lambdas using function-arguments semantics. Since there is no
>> such
>> thing as "def foo(x,)" then "lambda{|x,|" is considered as the
>> equivalent of "def foo(x)". Do I have it wrong?
>
> Blocks are blocks. It is neigher lambda nor multiple
> assigment.
>
> For example,
> lambda {|x| p x }.call(1,2,3) causes ArgumentError and
> x = 1,2,3 assignes x to [1,2,3] but
> def m() yield 1,2,3 end; m {|x| p x } binds x to 1.
> (ruby 1.9.0 (2008-02-13 revision 15455) [i686-linux])
>
> I wrote the semantics as a test:
> TestRubyYieldGen in test/ruby/test_yield.rb.
> --
> Tanaka Akira
>