[#42344] [ruby-trunk - Feature #5964][Open] Make Symbols an Alternate Syntax for Strings — Tom Wardrop <tom@...>

23 messages 2012/02/03

[#42443] [ruby-trunk - Bug #5985][Open] miniruby skews "make benchmark" results — Eric Wong <normalperson@...>

21 messages 2012/02/08

[#42444] [ruby-trunk - Bug #5986][Open] Segmentation Fault — Luis Matta <levmatta@...>

16 messages 2012/02/08

[#42471] [ruby-trunk - Feature #5995][Open] calling io_advise_internal() in read_all() — Masaki Matsushita <glass.saga@...>

20 messages 2012/02/10

[#42560] [ruby-trunk - Bug #6011][Open] ruby-1.9.3-p0/lib/webrick/utils.rb:184: [BUG] Segmentation fault — Vit Ondruch <v.ondruch@...>

12 messages 2012/02/13

[#42579] [ruby-trunk - Bug #6012][Open] Proc#source_location also return the column — Roger Pack <rogerpack2005@...>

14 messages 2012/02/14

[#42685] [ruby-trunk - Bug #6036][Open] Test failures in Fedora Rawhide/17 — Bohuslav Kabrda <bkabrda@...>

14 messages 2012/02/16

[#42697] [ruby-trunk - Bug #6040][Open] Transcoding test failure: Big5 to UTF8 not defined (MinGW) — Luis Lavena <luislavena@...>

10 messages 2012/02/16

[#42813] [ruby-trunk - Feature #6065][Open] Allow Bignum marshalling/unmarshalling from C API — Martin Bosslet <Martin.Bosslet@...>

22 messages 2012/02/23

[#42815] [ruby-trunk - Bug #6066][Open] Fix "control may reach end of non-void function" warnings for clang — Eric Hodel <drbrain@...7.net>

15 messages 2012/02/23

[#42857] [ruby-trunk - Feature #6074][Open] Allow alias arguments to have a comma — Thomas Sawyer <transfire@...>

20 messages 2012/02/24

[#42891] [ruby-trunk - Feature #6083][Open] Hide a Bignum definition — Koichi Sasada <redmine@...>

23 messages 2012/02/25

[#42906] [ruby-trunk - Bug #6085][Open] Treatment of Wrong Number of Arguments — Marc-Andre Lafortune <ruby-core@...>

14 messages 2012/02/25

[#42949] [ruby-trunk - Bug #6089][Open] Test suite fails with OpenSSL 1.0.1 — Vit Ondruch <v.ondruch@...>

13 messages 2012/02/26

[ruby-core:42920] [ruby-trunk - Feature #6070] The scope of for loop variables

From: Shugo Maeda <redmine@...>
Date: 2012-02-25 14:42:24 UTC
List: ruby-core #42920
Issue #6070 has been updated by Shugo Maeda.

File for_loop_scope_fix_0224.diff added

Hi,

>  I agree with your opinion regarding the current side effect problems of
>  `for`.  I would love to see your patch in Ruby 2.0!

Thanks for your agreement:)

I've updated my patch, whose changes are:

* use NODE_MEMO to avoid memory leak when parsing of expr_value failed.
* removed unused code.
* fixed tests for new behavior of for expressions.
* fixed rss/parser.rb for new behavior of for expressions.

A good news is that rss/parser.rb is the only library affected by this change of for expressions.
The patch passes make test, and the result of test-all is 1F0E, which is the same as the version without the patch.

The version with the patch is a bit faster than the original version:

defiant:ruby$ time ruby-trunk -e 'for i in 1..10000000; end'
ruby-trunk -e 'for i in 1..10000000; end'  3.92s user 0.01s system 99% cpu 3.936 total
defiant:ruby$ time build/ruby-trunk -e 'for i in 1..10000000; end'
build/ruby-trunk -e 'for i in 1..10000000; end'  3.52s user 0.02s system 99% cpu 3.545 total

----------------------------------------
Feature #6070: The scope of for loop variables
https://bugs.ruby-lang.org/issues/6070

Author: Shugo Maeda
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 2.0.0


Hi,

In Ruby, the scope of a for loop variable is not limited in the for expression,
which means that a for expression counts on side effects.

This sometimes causes unexpected behavior when closing a for loop variable using a closure.

  $ cat test.rb
  procs = []
  for lang in ["Ruby", "Scala", "Haskell"]
    procs << -> { p lang }
  end
  procs.each(&:call)
  $ ruby test.rb
  "Haskell"
  "Haskell"
  "Haskell"

Why not make a for loop variable local to the for expression like a block parameter?
In Ruby 1.8, a for expression is faster than a method call with a block, but it's not
true in Ruby 1.9, so there is no reason to give a for expression special treatment.

The compatibility might be a problem, but I believe that code depending on the current behavior is evil.
Ruby's for expression also allows a global variable and a method call as a for loop variable.  However,
I rarely see such code in real-world applications.

Furthermore, I've heard that the scope of a foreach loop variable is changed in C# 5.

  http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx?PageIndex=3

Why should Ruby be more conservative than C#?

I've attached a patch for POC.

There is at least one problem in this patch.  The problem is that it cannot handle
the following code in mkmf.rb.
# I suspected that this code was written by nobu, but it was written by Eric.

  for lib in libs = $libs.split
    ...
  end

It's because libs is considered local to the for expression in parsing phase, but the variable
can't be found in dyna vars in compiling phase.  I'm wondering how this code should behave and
how to implement it.



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

In This Thread