Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Ruby 1.8.7 Lambas: syntax and scoping issue (are these bugs?

Reply
Thread Tools

Ruby 1.8.7 Lambas: syntax and scoping issue (are these bugs?

 
 
Charlton Wang
Guest
Posts: n/a
 
      12-05-2008
I'm seeing two odd behaviours with using lambdas:

1. It seems as though having a lambda as a function argument with a
block causes a syntax error. It can be mitigated by adding a semicolon
or by using parentheses

def foo(rest)
puts rest.inspect
yield
end


# fails syntax error
foo arm1=>1, arm2=>lambda { puts "lambda" } do
puts "In bar block"
end

# fails syntax error
foo arm1=>lambda { puts "lambda" }, arm2=>1 do
puts "In bar block"
end

# fails syntax error
foo {arm1=>1, arm2=>lambda { puts "lambda" }} do
puts "In bar block"
end

# succeeds???
foo arm1=>1, arm2=>lambda { puts "lambda"; } do
puts "In bar block"
end

# succeeds???
foo (arm1=>1, arm2=>lambda { puts "lambda" }) do
puts "In bar block"
end

2. I'm not understanding the scoping rules for lambda with
instance_evals inside a class:

# If these statements are added at the beginning the
# the lambda will evaluate them first
# a = 4 # stmt 1
# b = 5 # stmt 2
class Bar
attr_accessor :a, :b
def initialize
@a = 1
@b = 2
end
def foo(&block)
instance_eval(&block)
end
end

m = lambda{puts a + b}
Bar.new.foo(&m)

Without stmt1 and stmt2 above, the code correctly outputs 3. But if
stmt1 and stmt2 are incommented, the output is 9 which seems to be the
global scope rather than the scope of the instance of Bar expected
with instance_eval.

Am I missing something?

Thanks,
Charlton
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
David A. Black
Guest
Posts: n/a
 
      12-05-2008
Hi --

On Sat, 6 Dec 2008, Charlton Wang wrote:

> I'm seeing two odd behaviours with using lambdas:


I'm skipping to #2 if that's OK.

> 2. I'm not understanding the scoping rules for lambda with
> instance_evals inside a class:
>
> # If these statements are added at the beginning the
> # the lambda will evaluate them first
> # a = 4 # stmt 1
> # b = 5 # stmt 2
> class Bar
> attr_accessor :a, :b
> def initialize
> @a = 1
> @b = 2
> end
> def foo(&block)
> instance_eval(&block)
> end
> end
>
> m = lambda{puts a + b}
> Bar.new.foo(&m)
>
> Without stmt1 and stmt2 above, the code correctly outputs 3. But if
> stmt1 and stmt2 are incommented, the output is 9 which seems to be the
> global scope rather than the scope of the instance of Bar expected
> with instance_eval.
>
> Am I missing something?


When Ruby sees a and b, it favors the interpretation that they are
local variables. If you want to ensure that they're interpreted as
method calls, you can do:

puts a() + b()


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS (Jan 12-15), Fort Lauderdale, FL
See http://www.rubypal.com for details
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

 
Reply With Quote
 
 
 
 
William James
Guest
Posts: n/a
 
      12-06-2008
Charlton Wang wrote:

> I'm seeing two odd behaviours with using lambdas:
>
> 1. It seems as though having a lambda as a function argument with a
> block causes a syntax error. It can be mitigated by adding a semicolon
> or by using parentheses
>
> def foo(rest)
> puts rest.inspect
> yield
> end
>
>
> # fails syntax error
> foo arm1=>1, arm2=>lambda { puts "lambda" } do
> puts "In bar block"
> end


The syntax is wrong whether or not you are passing
a Proc object as an argument.

def foo(rest)
puts rest.inspect
yield
end
==>nil
foo 'hello' { puts 'in block' }
SyntaxError: compile error
(irb):5: syntax error
foo 'hello' { puts 'in block' }
^
(irb):5: syntax error
from (irb):5
from :0
foo( 'hello' ){ puts 'in block' }
"hello"
in block
==>nil
foo( proc{p "I'm neither sheep nor lambda."} ){ puts 'in block' }
#<Proc:0x02b14a5c@(irb):6>
in block
==>nil

 
Reply With Quote
 
Charlton Wang
Guest
Posts: n/a
 
      12-07-2008
Sorry, you lost me with your example.

My block is being bound with do/end rather than {}. In your examples,
you're using {} which has tighter binding and the syntax error is
expected.

foo 'hello' do puts 'in block'; end

works just find but this isn't the same as what I'm asking. I'm binding
the lambda function as a hash value.

Or...maybe I'm missing something obvious.

Charlton

William James wrote:
> Charlton Wang wrote:
>
>>
>>
>> # fails syntax error
>> foo arm1=>1, arm2=>lambda { puts "lambda" } do
>> puts "In bar block"
>> end

>
> The syntax is wrong whether or not you are passing
> a Proc object as an argument.
>
> def foo(rest)
> puts rest.inspect
> yield
> end
> ==>nil
> foo 'hello' { puts 'in block' }
> SyntaxError: compile error
> (irb):5: syntax error
> foo 'hello' { puts 'in block' }
> ^
> (irb):5: syntax error
> from (irb):5
> from :0
> foo( 'hello' ){ puts 'in block' }
> "hello"
> in block
> ==>nil
> foo( proc{p "I'm neither sheep nor lambda."} ){ puts 'in block' }
> #<Proc:0x02b14a5c@(irb):6>
> in block
> ==>nil


--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
The Higgs bozo
Guest
Posts: n/a
 
      12-07-2008
Charlton Wang wrote:
>
> # fails syntax error
> foo arm1=>1, arm2=>lambda { puts "lambda" } do
> puts "In bar block"
> end


Curiously, that works in 1.9.

I also noticed this succeeds in 1.8 (and 1.9):

foo arm1=>1, arm2=>lambda { puts("lambda") } do
puts "In bar block"
end

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Charlton Wang
Guest
Posts: n/a
 
      12-07-2008
The Higgs bozo wrote:
> Charlton Wang wrote:
>>
>> # fails syntax error
>> foo arm1=>1, arm2=>lambda { puts "lambda" } do
>> puts "In bar block"
>> end

>
> Curiously, that works in 1.9.
>
> I also noticed this succeeds in 1.8 (and 1.9):
>
> foo arm1=>1, arm2=>lambda { puts("lambda") } do
> puts "In bar block"
> end


That's really interesting. So the parentheses as arguments to the puts
make it work. How odd!

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Class-level variables - a scoping issue John Nagle Python 22 10-15-2010 11:50 PM
Noob Q: ruby block scoping question (ruby TK) Philip Amadeo Saeli Ruby 4 05-01-2008 07:43 PM
STL Map Scoping Issue sfncook@gmail.com C++ 12 08-15-2007 11:33 AM
Scoping issue with import James Stroud Python 2 03-01-2005 10:18 AM
scoping issue Frederick Grim C++ 4 09-14-2003 07:39 AM



Advertisments