[#56333] [CommonRuby - Feature #8723][Open] Array.any? predicate returns true for empty array. — "nurettin (Nurettin Onur TUGCU)" <onurtugcu@...>

12 messages 2013/08/02

[#56368] [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

15 messages 2013/08/04

[#56407] [ruby-trunk - misc #8741][Open] email notification on bugs.ruby-lang.org is broken — "rits (First Last)" <redmine@...>

18 messages 2013/08/05

[#56524] [ruby-trunk - Bug #8770][Open] [PATCH] process.c: avoid EINTR from Process.spawn — "normalperson (Eric Wong)" <normalperson@...>

19 messages 2013/08/10

[#56536] [ruby-trunk - Feature #8772][Open] Hash alias #| merge, and the case for Hash and Array polymorphism — "trans (Thomas Sawyer)" <redmine@...>

24 messages 2013/08/11

[#56544] [ruby-trunk - Bug #8774][Open] rb_file_dirname return wrong encoding string when dir is "." — jiayp@... (贾 延平) <jiayp@...>

10 messages 2013/08/11

[#56569] [ruby-trunk - Feature #8781][Open] Use require_relative() instead of require() if possible — "ko1 (Koichi Sasada)" <redmine@...>

31 messages 2013/08/12
[#56582] [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — "drbrain (Eric Hodel)" <drbrain@...7.net> 2013/08/12

[#56584] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — SASADA Koichi <ko1@...> 2013/08/12

(2013/08/13 2:25), drbrain (Eric Hodel) wrote:

[#56636] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — Aaron Patterson <tenderlove@...> 2013/08/16

On Tue, Aug 13, 2013 at 07:38:01AM +0900, SASADA Koichi wrote:

[#56634] [ruby-trunk - Feature #8788][Open] use eventfd on newer Linux instead of pipe for timer thread — "normalperson (Eric Wong)" <normalperson@...>

11 messages 2013/08/16

[#56648] [ruby-trunk - Bug #8795][Open] "Null byte in string error" on Marshal.load — "mml (McClain Looney)" <m@...>

17 messages 2013/08/16

[#56824] [ruby-trunk - Feature #8823][Open] Run trap handler in an independent thread called "Signal thread" — "ko1 (Koichi Sasada)" <redmine@...>

14 messages 2013/08/27

[#56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "knu (Akinori MUSHA)" <knu@...>

11 messages 2013/08/30

[#56890] [ruby-trunk - Feature #8839][Open] Class and module should return the class or module that was opened — "headius (Charles Nutter)" <headius@...>

26 messages 2013/08/30

[#56894] [ruby-trunk - Feature #8840][Open] Yielder#state — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

14 messages 2013/08/30

[ruby-core:56363] [ruby-trunk - Bug #8693] lambda invoked by yield acts as a proc with respect to return

From: "rits (First Last)" <redmine@...>
Date: 2013-08-03 21:23:58 UTC
List: ruby-core #56363
Issue #8693 has been updated by rits (First Last).


alexeymuranov (Alexey Muranov) wrote:
> 
> I agree it would be nice if Matz clarified the issue.
> 
>   rits (First Last) wrote:
>   > 
>   > This notion that & somehow extracts the block from the lambda "shell", throwing the lambda shell away is incorrect.
> 
> If you mean that this is not how things work, apparently it is true.  But for me it would be the most natural if "(({&}))" was converting a lambda/proc into a block, and "(({&p}))" in the end of the argument list was wrapping the block into a proc called "(({p}))".  For me in fact it would be the only non-surprizing behavior.
>
> Consider this:
> 
>   def m *a
>     a.object_id
>   end
> 
>   a = []
> 
>   a.object_id # => 2155500640
>   m *a        # => 2155435920 (different)
> 
> This looks completely normal to me.

* extracts individual elements and passes them individually, in fact the receiving method can then regroup the individual args in many different ways:

irb(main):010:0> def m1(a, *args, b); [a, args, b] end; m1 *[1, 2, 3, 4]
=> [1, [2, 3], 4]

the original array, by definition, is discarded, only the elements are passed, so this can't work any other way, whereas method(&proc_or_lamda) can theoretically works in both modes (keep and invoke the proc/lambda or "extract" and keep just the block).  At a minimum it should be consistent.  Currently it keeps and invokes the proc, but with hybrid proc/lambda semantics (argument checking of a lambda, return of a proc).  The current behavior is bug regardless of which conceptual model you pick.

As to which model is preferable, I suppose that's debatable. I like the current model of keeping and invoking the proc/lambda (with this bug fixed).  More on that below.

> 
> However, i am surprised with this:
> 
>   def m &p
>     p.object_id
>   end
> 
>   p = proc{}
> 
>   p.object_id # => 2154923560
>   m &p        # => 2154923560 (same)
> 

blocks are not first class citizens in ruby, there's no block class or block objects, so conceptually it makes sense to think of blocks as a role (or slot).  So the block role can be played a syntactic ruby block or by a proc.  If you think of it as a role/slot then the proc does not need to be unwrapped into a block "object" and then re-wrapped, but merely assume the block role or be put into the block slot, and then looked up in the block slot.  This model has implication for this bug, yield would check the block slot and if there's a proc there, simply invoke it.  I think this is what actually happens (given the evidence I provided: lambda is retained, lambda arity is enforced).  The only quirk is the "return"


----------------------------------------
Bug #8693: lambda invoked by yield acts as a proc with respect to return
https://bugs.ruby-lang.org/issues/8693#change-40870

Author: rits (First Last)
Status: Rejected
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0p247 (2013-06-27) [x64-mingw32]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


irb(main):004:0> def m1; yield end; def m2; m1 &->{return 0}; 1 end; m2
=> 0



-- 
http://bugs.ruby-lang.org/

In This Thread