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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Good Night M. (Guest)
on 2007-07-22 11:36
(Received via mailing list)
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?
Sharon P. (Guest)
on 2007-07-22 11:51
(Received via mailing list)
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
Good Night M. (Guest)
on 2007-07-23 00:35
(Received via mailing list)
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.
unknown (Guest)
on 2007-07-23 01:12
(Received via mailing list)
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
Roger P. (Guest)
on 2007-07-24 02:22
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
F. Senault (Guest)
on 2007-07-24 02:37
(Received via mailing list)
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
This topic is locked and can not be replied to.