Lexical vs Dynamic Scope

T

Tim Morgan

Forgive this very basic question, but Googling has not answered my
question, and I'm sure it's a simple one for the gurus here.

I've been using Ruby for years, and I've always had questions about
how it handles scope. Usually Ruby just does what I would expect it
to.

In reading about lexical vs. dynamic scope on various places on the
Web, I read that Ruby has lexical (static) scope. But I cannot prove
it to myself with code. For example, the following produces one (1) --
not zero (0) as I would expect it to if Ruby was truly statically
scoped:

x = 0
f = Proc.new { x }
g = Proc.new {
x = 1
f.call
}
puts g.call
# => 1

(I purposely used Procs instead of regular methods here since Ruby
methods cannot see the top-level "x" variable at all, which is a whole
other issue.)

Is Ruby really dynamically scoped?
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

Forgive this very basic question, but Googling has not answered my
question, and I'm sure it's a simple one for the gurus here.

I've been using Ruby for years, and I've always had questions about
how it handles scope. Usually Ruby just does what I would expect it
to.

In reading about lexical vs. dynamic scope on various places on the
Web, I read that Ruby has lexical (static) scope. But I cannot prove
it to myself with code. For example, the following produces one (1) --
not zero (0) as I would expect it to if Ruby was truly statically
scoped:

x = 0
f = Proc.new { x }
g = Proc.new {
x = 1
f.call
}
puts g.call
# => 1

(I purposely used Procs instead of regular methods here since Ruby
methods cannot see the top-level "x" variable at all, which is a whole
other issue.)

Is Ruby really dynamically scoped?
The x in g is the same as the x outside of g. There is only one single x in
your program, so this doesn't show much. Maybe this instead?

def show_error(f)
f.call
rescue => e
e
end

f = lambda { x }
show_error f # => #<NameError: undefined local variable or method `x' for
main:Object>

x = 1
show_error f # => #<NameError: undefined local variable or method `x' for
main:Object>

g = lambda { x }
show_error g # => 1
 
T

Tim Morgan

The x in g is the same as the x outside of g. There is only one single x in
your program, so this doesn't show much. Maybe this instead?

Ahhh. I see. Thanks!
 
A

Abinoam Jr.

def show_error(f)
=A0f.call
rescue =3D> e
=A0e
end

f =3D lambda { x }
show_error f # =3D> #<NameError: undefined local variable or method `x' f= or
main:Object>

x =3D 1
show_error f # =3D> #<NameError: undefined local variable or method `x' f= or
main:Object>

g =3D lambda { x }
show_error g # =3D> 1


After doing the above, try this.

def x
"Anything returned by the (Receiver).x method"
end

show_error f # =3D> "Anything returned by the (Receiver).x method"
show_error g # =3D> 1

At compile time...
f =3D lambda { x }
x is not defined, and is thought to be a method!

Look...
http://www.ruby-forum.com/topic/724184

Abinoam Jr.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,754
Messages
2,569,521
Members
44,995
Latest member
PinupduzSap

Latest Threads

Top