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.
32e8856c7a30927da74addfcccffb8fc?d=identicon&s=25 Good Night Moon (Guest)
on 2007-07-22 09: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?
D86ec78a7a258246684d15e09e51a170?d=identicon&s=25 Sharon Phillips (Guest)
on 2007-07-22 09:51
(Received via mailing list)
On 22/07/2007, at 5:35 PM, Good Night Moon 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
32e8856c7a30927da74addfcccffb8fc?d=identicon&s=25 Good Night Moon (Guest)
on 2007-07-22 22:35
(Received via mailing list)
On Sun, 22 Jul 2007 16:51:26 +0900, Sharon Phillips 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.
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 unknown (Guest)
on 2007-07-22 23:12
(Received via mailing list)
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
Bec38d63650c8912b6ba9b557fb953b9?d=identicon&s=25 Roger Pack (rogerdpack)
on 2007-07-24 00: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 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
B57c5af36f5c1f33243dd8b2dd9043b1?d=identicon&s=25 F. Senault (Guest)
on 2007-07-24 00:37
(Received via mailing list)
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
This topic is locked and can not be replied to.