[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: local vars clobbered by un-run code

Yukihiro Matsumoto

6/19/2007 2:35:00 AM

Hi,

It's not a bug. Assignments makes identifiers local variables,
statically.

matz.

In message "Re: local vars clobbered by un-run code"
on Tue, 19 Jun 2007 11:21:03 +0900, Trans <transfire@gmail.com> writes:
|
|Err...
|
| irb(main):001:0> def x; 1; end
| => nil
| irb(main):002:0> p x
| 1
| => nil
| irb(main):003:0> if false
| irb(main):004:1> x = x() + 1
| irb(main):005:1> end
| => nil
| irb(main):006:0> x
| => nil
|
|Don't tell me, it's some quirk of the way Ruby works. Sure looks like
|a bug though. Just in case:
|
| ruby 1.8.4 (2005-12-24) [i486-linux]
|
|Hmm... I just got a dejavu. Maybe I came across this before.
|
|T.

7 Answers

Trans

6/19/2007 2:54:00 AM

0



On Jun 18, 10:35 pm, Yukihiro Matsumoto <m...@ruby-lang.org> wrote:
> Hi,
>
> It's not a bug. Assignments makes identifiers local variables,
> statically.
>
> matz.

This must be the matz-bot. The answer came instantaneously and, deja-
vu again, I think it's same one I got before ;)

Thanks matz,
T.


Robert Dober

6/19/2007 5:48:00 AM

0

On 6/19/07, Trans <transfire@gmail.com> wrote:
>
>
> On Jun 18, 10:35 pm, Yukihiro Matsumoto <m...@ruby-lang.org> wrote:
> > Hi,
> >
> > It's not a bug. Assignments makes identifiers local variables,
> > statically.
> >
> > matz.
>
> This must be the matz-bot. The answer came instantaneously and, deja-
> vu again, I think it's same one I got before ;)
Let us see?

Which assignment Matz?

irb(main):001:0> def x;1 end
=> nil
irb(main):002:0> if false then
irb(main):003:1* def x; 2 end
irb(main):004:1> end
=> nil
irb(main):005:0> x
=> 1
irb(main):006:0> def y; 1 end
=> nil
irb(main):007:0> if false
irb(main):008:1> undef y
irb(main):009:1> end
=> nil
irb(main):010:0> y
=> 1

Surely the statements inside if are not executed.

Cheers
Robert
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

tsela.cg

6/19/2007 8:17:00 AM

0

On 19 jun, 07:48, "Robert Dober" <robert.do...@gmail.com> wrote:
>
> Let us see?
>
> Which assignment Matz?
>
> irb(main):001:0> def x;1 end
> => nil
> irb(main):002:0> if false then
> irb(main):003:1* def x; 2 end
> irb(main):004:1> end
> => nil
> irb(main):005:0> x
> => 1
> irb(main):006:0> def y; 1 end
> => nil
> irb(main):007:0> if false
> irb(main):008:1> undef y
> irb(main):009:1> end
> => nil
> irb(main):010:0> y
> => 1
>
> Surely the statements inside if are not executed.
>

No, but they are parsed. And identifiers are made local variables at
parse time, not at execution time. So if you have an assignment
anywhere, even in a place that will never actually execute, the
identifier used in the assignment will be considered a local variable
by the interpreter.

Christophe.

Robert Dober

6/19/2007 8:31:00 AM

0

On 6/19/07, tsela.cg@gmail.com <tsela.cg@gmail.com> wrote:

>
> No, but they are parsed. And identifiers are made local variables at
> parse time, not at execution time. So if you have an assignment
> anywhere, even in a place that will never actually execute, the
> identifier used in the assignment will be considered a local variable
> by the interpreter.
>
> Christophe.

I guess this can be concluded by what is happening, but is this any
reason to accept this behavior? I honestly do not feel so!

Cheers
Robert

--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Trans

6/19/2007 1:28:00 PM

0



On Jun 19, 4:30 am, "Robert Dober" <robert.do...@gmail.com> wrote:
> On 6/19/07, tsela...@gmail.com <tsela...@gmail.com> wrote:
>
>
>
> > No, but they are parsed. And identifiers are made local variables at
> > parse time, not at execution time. So if you have an assignment
> > anywhere, even in a place that will never actually execute, the
> > identifier used in the assignment will be considered a local variable
> > by the interpreter.
>
> > Christophe.
>
> I guess this can be concluded by what is happening, but is this any
> reason to accept this behavior? I honestly do not feel so!

I do not feel so either. But, I've also learned that Ruby just has
some quirks. Matz wouldn't had done it this way unless there was a
very real need to do so. Now, that's not to say he might not have
missed a better solution, so it's still worth discussing if anyone has
one.

T.


Daniel Martin

6/19/2007 10:37:00 PM

0

"Robert Dober" <robert.dober@gmail.com> writes:

> I guess this can be concluded by what is happening, but is this any
> reason to accept this behavior? I honestly do not feel so!

On the other hand, I find the idea that the scoping and binding of
variables could change based on the particular code path followed at
run time a horribly non-intuitive concept, since I think of "variable
scope" as something as static as the code itself - that is, you should
only be able to screw with variable scoping by strange
meta-programming tricks.

--
s=%q( Daniel Martin -- martin@snowplow.org
puts "s=%q(#{s})",s.to_a.last )
puts "s=%q(#{s})",s.to_a.last

Mariusz Pekala

6/20/2007 1:32:00 PM

0

On 2007-06-20 07:37:14 +0900 (Wed, Jun), Daniel Martin wrote:
> On the other hand, I find the idea that the scoping and binding of
> variables could change based on the particular code path followed at
> run time a horribly non-intuitive concept, since I think of "variable
> scope" as something as static as the code itself - that is, you should
> only be able to screw with variable scoping by strange
> meta-programming tricks.

Maybe I don't understand something, but the decision whether something
is a variable or is a method call is based not on the code executed
(which is hard to predict when reading the source) but on the code
parsed, which is pretty static.

def this_method( x )
p y # This 'y' will always be a method call.
# (even if you call this_method again)
if x
y = 1 # because of this line in the source code...
end
p y # ...this 'y' will always be a variable.
end # ..independent on the value of x

So, I would (IMHO) assume, that this is not bad-black-magic, but
good-and-understandable-white-magic aspect of ruby.

The confision may emerge when the block of code has many lines, hard to
grasp in one eye shot, but I have been taught that if you write a
function that is longer than half of your editor window you should
extract part of it into another function.
With short blocks it is harder to mistake a method for a variable.

P.S.:
If someone still does not like this magic behaviour, assume that it
saves you from writing:

def this_method( x )
p y
if x
#pragma set_as_variable(y) /* and if you forgot, you will get parse-error */
y = 1
end
p y
end

;-)

--
No virus found in this outgoing message.
Checked by 'grep -i virus $MESSAGE'
Trust me.