Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Syntax bug, in 1.8.5? return not (some expr) <-- syntax error vsreturn (not (some expr)) <-- fine

Reply
Thread Tools

Syntax bug, in 1.8.5? return not (some expr) <-- syntax error vsreturn (not (some expr)) <-- fine

 
 
Good Night Moon
Guest
Posts: n/a
 
      07-22-2007
Well, it's all in the subject, to me it looks like a parsing bug:

class MyRect
def intersects_good(other)
return (not ((other.x1 < self.x0 or self.x1 < other.x0) and
(other.y1 < self.y0 or self.y1 < other.y0)))
end

def intersects_bad(other)
return not ((other.x1 < self.x0 or self.x1 < other.x0) and
(other.y1 < self.y0 or self.y1 < other.y0))
end
end

foo> ruby -c myrect.rb
myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
return not ((other.x1 < self.x0 or self.x1 < other.x0) and
^

Any comment? Is this known? Or just some hair in the Ruby grammar?
 
Reply With Quote
 
 
 
 
Bil Kleb
Guest
Posts: n/a
 
      07-22-2007
Good Night Moon wrote:
>
> myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
> return not ((other.x1 < self.x0 or self.x1 < other.x0) and


You need to use the '!' operator instead of the 'not' "conjunction".
It's a precedence thing -- the parser is seeing 'return not' -- see
parse.y in the source.

Regards,
--
Bil Kleb
http://fun3d.larc.nasa.gov
 
Reply With Quote
 
 
 
 
Sharon Phillips
Guest
Posts: n/a
 
      07-22-2007
On 22/07/2007, at 5:35 PM, Good Night Moon wrote:

> Well, it's all in the subject, to me it looks like a parsing bug:
>
> class MyRect
> def intersects_good(other)
> return (not ((other.x1 < self.x0 or self.x1 < other.x0) and
> (other.y1 < self.y0 or self.y1 < other.y0)))
> end
>
> def intersects_bad(other)
> return not ((other.x1 < self.x0 or self.x1 < other.x0) and
> (other.y1 < self.y0 or self.y1 < other.y0))
> end
> end
>
> foo> ruby -c myrect.rb
> myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
> return not ((other.x1 < self.x0 or self.x1 < other.x0) and
> ^
>
> Any comment? Is this known? Or just some hair in the Ruby grammar?


There's a difference between [not, and, or] and [!, &&, ||]
Not sure what it is, but I've found it better to use the latter.
Still, if you wrap the whole statement in another set of brackets
(like intersects_good) it will work.

def intersects_bad(other)
return (not ((other.x1 < self.x0 or self.x1 < other.x0) and
(other.y1 < self.y0 or self.y1 < other.y0)))
end

by the way, what's the difference between the two methods? They
appear identical.

Cheers,
Dave


 
Reply With Quote
 
Good Night Moon
Guest
Posts: n/a
 
      07-22-2007
On Sun, 22 Jul 2007 03:50:01 -0400, Bil Kleb wrote:
>> myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
>> return not ((other.x1 < self.x0 or self.x1 < other.x0) and

>
> You need to use the '!' operator instead of the 'not' "conjunction".
> It's a precedence thing -- the parser is seeing 'return not' -- see
> parse.y in the source.


Thanks, maybe I'll look. It's not just precedence though, or else
'return' itself is part of it:

def ok
return (not true)
end

def fails
return not true
end

And note that within an 'if', it works as you'd expect:

def with_parens_ok
if (not true)
puts "not true"
end
end

def no_parens_ok
if not true
puts "not true"
end
end

 
Reply With Quote
 
Good Night Moon
Guest
Posts: n/a
 
      07-22-2007
On Sun, 22 Jul 2007 16:51:26 +0900, Sharon Phillips wrote:
> There's a difference between [not, and, or] and [!, &&, ||] Not sure
> what it is, but I've found it better to use the latter. Still, if you
> wrap the whole statement in another set of brackets (like
> intersects_good) it will work.
>
> def intersects_bad(other)
> return (not ((other.x1 < self.x0 or self.x1 < other.x0) and
> (other.y1 < self.y0 or self.y1 < other.y0)))
> end
>
> by the way, what's the difference between the two methods? They appear
> identical.


Thanks. The difference is just to point out what looks like
a bug; the parens shouldn't make a difference. Look at
my other reply in this thread for elaboration.
 
Reply With Quote
 
dblack@wobblini.net
Guest
Posts: n/a
 
      07-22-2007
Hi --

On Mon, 23 Jul 2007, Good Night Moon wrote:

> On Sun, 22 Jul 2007 16:51:26 +0900, Sharon Phillips wrote:
>> There's a difference between [not, and, or] and [!, &&, ||] Not sure
>> what it is, but I've found it better to use the latter. Still, if you
>> wrap the whole statement in another set of brackets (like
>> intersects_good) it will work.
>>
>> def intersects_bad(other)
>> return (not ((other.x1 < self.x0 or self.x1 < other.x0) and
>> (other.y1 < self.y0 or self.y1 < other.y0)))
>> end
>>
>> by the way, what's the difference between the two methods? They appear
>> identical.

>
> Thanks. The difference is just to point out what looks like
> a bug; the parens shouldn't make a difference. Look at
> my other reply in this thread for elaboration.


I don't think it's a bug. Have a look at these examples:

def x; return 1 and puts "I'm gone!"; end
SyntaxError: compile error
(irb):3: void value expression

def x; 2 not 3; end
SyntaxError: compile error
(irb):5: syntax error, unexpected kNOT, expecting kEND

These both make sense. 'and' is right-associative, so you're trying
to do something after having already returned, which doesn't work.
And in general you can't do "x not y", which is what "return not ..."
is read as.


David

--
* Books:
RAILS ROUTING (new! http://www.awprofessional.com/title/0321509242)
RUBY FOR RAILS (http://www.manning.com/black)
* Ruby/Rails training
& consulting: Ruby Power and Light, LLC (http://www.rubypal.com)

 
Reply With Quote
 
Gregory Brown
Guest
Posts: n/a
 
      07-23-2007
On 7/22/07, Good Night Moon <> wrote:
> On Sun, 22 Jul 2007 03:50:01 -0400, Bil Kleb wrote:
> >> myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
> >> return not ((other.x1 < self.x0 or self.x1 < other.x0) and

> >
> > You need to use the '!' operator instead of the 'not' "conjunction".
> > It's a precedence thing -- the parser is seeing 'return not' -- see
> > parse.y in the source.

>
> Thanks, maybe I'll look. It's not just precedence though, or else
> 'return' itself is part of it:


if binds differently than return. It is precedence.

 
Reply With Quote
 
Roger Pack
Guest
Posts: n/a
 
      07-23-2007
I agree that
if not File.exists? "a"
do stuff
end

would be nice intuitively. I wish...

unknown wrote:
> Hi --
>
> On Mon, 23 Jul 2007, Good Night Moon wrote:
>
>>>
>>> by the way, what's the difference between the two methods? They appear
>>> identical.

>>
>> Thanks. The difference is just to point out what looks like
>> a bug; the parens shouldn't make a difference. Look at
>> my other reply in this thread for elaboration.

>
> I don't think it's a bug. Have a look at these examples:
>
> def x; return 1 and puts "I'm gone!"; end
> SyntaxError: compile error
> (irb):3: void value expression
>
> def x; 2 not 3; end
> SyntaxError: compile error
> (irb):5: syntax error, unexpected kNOT, expecting kEND
>
> These both make sense. 'and' is right-associative, so you're trying
> to do something after having already returned, which doesn't work.
> And in general you can't do "x not y", which is what "return not ..."
> is read as.
>
>
> David


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

 
Reply With Quote
 
F. Senault
Guest
Posts: n/a
 
      07-23-2007
Le 24 juillet 2007 à 00:22, Roger Pack a écrit :

> I agree that
> if not File.exists? "a"
> do stuff
> end
>
> would be nice intuitively. I wish...


unless File.exists? "a"
do stuff
end

do stuff unless File.exists? "a"

Isn't it even more intuitive ?

Fred
--
If you no longer admin for the fsckers do they really exist?
(Vagn Scott in the SDM)
 
Reply With Quote
 
Rick DeNatale
Guest
Posts: n/a
 
      07-25-2007
On 7/22/07, Gregory Brown <> wrote:
> On 7/22/07, Good Night Moon <> wrote:
> > On Sun, 22 Jul 2007 03:50:01 -0400, Bil Kleb wrote:
> > >> myrect.rb:8: syntax error, unexpected kNOT, expecting kEND
> > >> return not ((other.x1 < self.x0 or self.x1 < other.x0) and
> > >
> > > You need to use the '!' operator instead of the 'not' "conjunction".
> > > It's a precedence thing -- the parser is seeing 'return not' -- see
> > > parse.y in the source.

> >
> > Thanks, maybe I'll look. It's not just precedence though, or else
> > 'return' itself is part of it:

>
> if binds differently than return. It is precedence.


Except that return isn't an operator. As far as I can tell, looking
at parse.y for ruby1.8.6 the parse tree for the original statement
which raised the question

return not true

should be:

command_call
kRETURN expr
kNOT expr
primary
var_ref
variable
kTRUE

There definitely looks to be something strange here.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.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
Syntax error? What syntax error? Assignment fo default values? Mark Richards Perl Misc 3 11-18-2007 05:01 PM
invalid argument in IE, yet everything fine in FireFox, no syntax error reported lkrubner@geocities.com Javascript 1 07-16-2005 08:15 AM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM
boutique and fine art royalty free images - free fine art image offer Andrew Mowat Digital Photography 0 09-14-2004 05:35 AM
PySqlite client_encoding, stores fine but queries don't return unicode Irmen de Jong Python 0 12-01-2003 08:06 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57