Syntax bug, in 1.8.5? return not (some expr) <-- syntax err


#1

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?


#2

On 22/07/2007, at 5:35 PM, Good Night M. wrote:

             (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


#3

On Sun, 22 Jul 2007 16:51:26 +0900, Sharon P. 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.


#4

Hi –

On Mon, 23 Jul 2007, Good Night M. 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


#5

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 M. 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


#6

Le 24 juillet 2007 à 00:22, Roger P. 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