--0015175d675c8b06c7046ef25e35
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Matz,
One of the biggest breaking changes in Ruby 1.9 is the change in constant
lookup inside a proc that is *_eval'ed.

For instance,

*1.8*
*
*
class Foo
  class Bar
  end
  def evaluate(&blk) instance_eval(&blk) end
end

Foo.new.evaluate { Bar }
NameError: uninitialized constant Bar

*1.9*

class Foo
  class Bar
  end

  def evaluate(&blk) instance_eval(&blk) end
end

Foo.new.evaluate { Bar }
Foo::Bar


The 1.9 behavior is understandable if everything is in one file. However, in
the normal case, instance_eval is used to implement DSLs. For instance,
rspec has the following semantics:

module RubyFun
  class Foo
  end

  describe ("Foo") do
    it("exists") do
      lambda { Foo }.should_not raise_error
    end
  end
dnc

This test passes in 1.8 but not in 1.9 because of the change in behavior. It
also clearly articulates the *reason* for the 1.8 behavior: it is more the
expected behavior. One of the things that's great about Ruby is that it
focuses on programmer understanding, even if that is sometimes slow. This is
a case where the programmer expects to see a constant but it is being looked
up somewhere the programmer knows nothing about. I think it is clear that
the old behavior is better, even if it is harder to implement. Additionally,
both JRuby and Rubinius were able to implement the old behavior in a
compiled system, so it should be possible.

Thanks for your time.

-- 
Yehuda Katz
Developer | Engine Yard
(ph) 718.877.1325

--0015175d675c8b06c7046ef25e35
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Matz,<div><br></div><div>One of the biggest breaking changes in Ruby 1.9 ishe change in constant lookup inside a proc that is *_eval&#39;ed.</div><div><br></div><div>For instance,</div><div><br></div><div><div><b>1.8</b></div>

<div><b><br></b></div><div>class Foo</div><div>  class Bar</div><div>  end</div><div>  def evaluate(&amp;blk) instance_eval(&amp;blk) end</div><div>end</div><div><br></div><div>Foo.new.evaluate { Bar }</div><div>NameError: uninitialized constant Bar</div>

<div><br></div><div><b>1.9</b></div><div><br></div><div>class Foo</div><div>  class Bar</div><div>  end</div><div>  </div><div>  def evaluate(&amp;blk) instance_eval(&amp;blk) end</div><div>end</div><div><br></div><div>Foo.new.evaluate { Bar }</div>

<div>=&gt; Foo::Bar</div><div><br></div><div><br></div><div>The 1.9 behavior is understandable if everything is in one file. However, in the normal case, instance_eval is used to implement DSLs. For instance, rspec has the following semantics:</div>

<div><br></div><div>module RubyFun</div><div>  class Foo</div><div>  end</div><div><br></div><div>  describe (&quot;Foo&quot;) do</div><div>    O     
<div>    伯  end</div><div>dnc</div><div><br></div><div>This test passes in 1.8 but not in 1.9 because of the change in behavior. It also clearly articulates the <b>reason</b>  豮                                                    宼
<div><br></div><div>Thanks for your time.</div><br>-- <br>Yehuda Katz<br>Developer | Engine Yard<br>(ph) 718.877.1325<br>
</div>

--0015175d675c8b06c7046ef25e35--