Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Very weird behaviour of Ruby 1.8.6 with multi-line parenthesis expressions

Reply
Thread Tools

Very weird behaviour of Ruby 1.8.6 with multi-line parenthesis expressions

 
 
Nicolas Lehuen
Guest
Posts: n/a
 
      08-06-2007
Hi,

I've just lost a few hours on this strange behaviour (bug ?).
Apparently it is caused by some kind of operator precedence
thingamagic. My original code was of course much more complicated, so
finding the problem wasn't easy (I first thought my code was
buggy...). Here is a piece of minimal code that reproduces the
problem :

8<-------------8<-------------8<-------------8<-------------

C:\temp>ver

Microsoft Windows [version 6.0.6000]

C:\temp>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

C:\temp>type bug.rb
sum1 = 1 + 1 + 1

puts sum1

sum2 = (
1
+ 1
+ 1
)

puts sum2

C:\temp>ruby bug.rb
3
1

8<-------------8<-------------8<-------------8<-------------

>From now on I promise I'll remember that you cannot safely use multi-

line parenthesis expressions in Ruby ; I just would like to understand
what this code means to Ruby, if it's not "give me the result of 1 + 1
+ 1".

The same takes place in irb :

C:\temp>irb
irb(main):001:0> sum1 = 1 + 1 + 1
=> 3
irb(main):002:0> sum2 = (
irb(main):003:1* 1
irb(main):004:1> + 1
irb(main):005:1> + 1
irb(main):006:1> )
=> 1
irb(main):007:0> op3 = (
irb(main):008:1* 1
irb(main):009:1> * 3
irb(main):010:1> * 9
irb(main):011:1> )
SyntaxError: compile error
(irb):9: syntax error, unexpected '\n', expecting tCOLON2 or '[' or
'.'
from (irb):11
from :0

Duh ! This must mean something, but what ?

Regards,

Nicolas Lehuen

 
Reply With Quote
 
 
 
 
Gregory Brown
Guest
Posts: n/a
 
      08-06-2007
On 8/6/07, Nicolas Lehuen <(E-Mail Removed)> wrote:
> Hi,
>
> I've just lost a few hours on this strange behaviour (bug ?).
> Apparently it is caused by some kind of operator precedence
> thingamagic. My original code was of course much more complicated, so
> finding the problem wasn't easy (I first thought my code was
> buggy...). Here is a piece of minimal code that reproduces the
> problem :
>
> 8<-------------8<-------------8<-------------8<-------------
>
> C:\temp>ver
>
> Microsoft Windows [version 6.0.6000]
>
> C:\temp>ruby -v
> ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
>
> C:\temp>type bug.rb
> sum1 = 1 + 1 + 1
>
> puts sum1
>
> sum2 = (
> 1
> + 1
> + 1


+ is a unary operator.

this parses as:

(
1; +1; +1;
)

If you want 3, do:

1 +
1 +
1

which parses as 1 + 1 + 1

 
Reply With Quote
 
 
 
 
Tom Werner
Guest
Posts: n/a
 
      08-06-2007
Nicolas Lehuen wrote:
> Hi,
>
> I've just lost a few hours on this strange behaviour (bug ?).
> Apparently it is caused by some kind of operator precedence
> thingamagic. My original code was of course much more complicated, so
> finding the problem wasn't easy (I first thought my code was
> buggy...). Here is a piece of minimal code that reproduces the
> problem :
>
> 8<-------------8<-------------8<-------------8<-------------
>
> C:\temp>ver
>
> Microsoft Windows [version 6.0.6000]
>
> C:\temp>ruby -v
> ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
>
> C:\temp>type bug.rb
> sum1 = 1 + 1 + 1
>
> puts sum1
>
> sum2 = (
> 1
> + 1
> + 1
> )
>
> puts sum2
>
> C:\temp>ruby bug.rb
> 3
> 1
>
> 8<-------------8<-------------8<-------------8<-------------
>
> >From now on I promise I'll remember that you cannot safely use multi-

> line parenthesis expressions in Ruby ; I just would like to understand
> what this code means to Ruby, if it's not "give me the result of 1 + 1
> + 1".
>
> The same takes place in irb :
>
> C:\temp>irb
> irb(main):001:0> sum1 = 1 + 1 + 1
> => 3
> irb(main):002:0> sum2 = (
> irb(main):003:1* 1
> irb(main):004:1> + 1
> irb(main):005:1> + 1
> irb(main):006:1> )
> => 1
> irb(main):007:0> op3 = (
> irb(main):008:1* 1
> irb(main):009:1> * 3
> irb(main):010:1> * 9
> irb(main):011:1> )
> SyntaxError: compile error
> (irb):9: syntax error, unexpected '\n', expecting tCOLON2 or '[' or
> '.'
> from (irb):11
> from :0
>
> Duh ! This must mean something, but what ?
>
> Regards,
>
> Nicolas Lehuen
>
>
>
>

+1 is a valid ruby statement by itself. In order for the interpreter to
realize that your statement continues onto another line, you must end
the line with an operator that begs for more. In your case, moving the
pluses up to the previous lines will work:

irb(main):003:0> (1 +
irb(main):004:1* 1 +
irb(main):005:1* 1)
=> 3

You get that error in irb with multiplication because * 3 is not a valid
ruby statement by itself (remember that + 1 is valid, meaning simply, 1).

Hope this helps!

Tom

 
Reply With Quote
 
Nicolas Lehuen
Guest
Posts: n/a
 
      08-06-2007
OK, now I get it, pluses need to go at the end of the line. Thanks
Gregory and Tom !

Regards,
Nicolas

 
Reply With Quote
 
Tom Werner
Guest
Posts: n/a
 
      08-06-2007
Michael Hollins wrote:
>
> Are there any interesting uses of
>
> + x
>
> as a statement on its own, or is it likely that
> it's a programmer error 99 times out 100? If the latter, perhaps it's
> worth
> the ruby interpreter emitting a warning when it sees such constructs,
> much
> like the warning you get when you don't use parantheses around
> argument lists
> in certain situations.
>
> I'm happy to be told that there are valid uses of "+ x". I'm still
> learning something
> new about ruby every day.
>
> cheers,
> mick
>
>

I've seen it used in DSLs (domain specific languages) built with ruby.
It can be defined on your own classes like so:

class Foo
def initialize(x)
@x = x
end

def +@
@x.reverse
end
end

+Foo.new('foo')
# => "oof"

I don't think I've ever used it in any of my code, but that doesn't mean
there aren't legitimate uses for it. Anyone else used unary plus for
something useful?

Tom

 
Reply With Quote
 
Joel VanderWerf
Guest
Posts: n/a
 
      08-07-2007
Michael Hollins wrote:
> Are there any interesting uses of
>
> + x
>
> as a statement on its own, or is it likely that
> it's a programmer error 99 times out 100?


Not that I'm recommending it, but just as an idea:


module Enumerable
def +@
inject {|s,x| s+(+x)}
end
end

class Object
def +x
x
end
end

p +[1,2,3] # => 6

sum = +[1, [2, 3], [4.0]]

p sum # => 10.0

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

 
Reply With Quote
 
Pit Capitain
Guest
Posts: n/a
 
      08-07-2007
2007/8/7, Michael Hollins <(E-Mail Removed)>:
> Are there any interesting uses of
>
> + x
>
> as a statement on its own, or is it likely that
> it's a programmer error 99 times out 100?


I sometimes use +x side by side with -x. For example

UP = -1
DOWN = +1

Regards,
Pit

 
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
I found some very odd behaviour in Python's very basic types Sunjay Varma Python 4 03-10-2011 05:05 PM
problems with regular expressions and parenthesis Daniel Fac Ruby 3 11-02-2008 01:26 AM
Very weird compiler bug or normal ISO C++ behaviour? fabio.bizzetti@REMOVETHISTOMAILMEomega64.com C++ 9 09-13-2006 06:25 AM
Agh... Very, VERY weird AS5200 / PIX issue Jeff Cisco 1 01-27-2004 10:29 PM
Regular expressions and parenthesis in match text Carl Cunningham Perl Misc 2 09-15-2003 11:02 AM



Advertisments