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
> 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
···
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
> 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?
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
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
···
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. 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.
···
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.
Hi --
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
···
On Mon, 23 Jul 2007, Good Night Moon wrote:
On Sun, 22 Jul 2007 16:51:26 +0900, Sharon Phillips wrote:
--
* 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)
if binds differently than return. It is precedence.
···
On 7/22/07, Good Night Moon <no.email.here@zombo.com> 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:
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/\.
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.
···
On 7/22/07, Gregory Brown <gregory.t.brown@gmail.com> wrote:
On 7/22/07, Good Night Moon <no.email.here@zombo.com> 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.
--
Rick DeNatale
My blog on Ruby
http://talklikeaduck.denhaven2.com/
unless File.exists? "a"
do stuff
end
do stuff unless File.exists? "a"
Isn't it even more intuitive ?
Fred
···
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...
--
If you no longer admin for the fsckers do they really exist?
(Vagn Scott in the SDM)