On Wed, 4 Apr 2007, Nobuyoshi Nakada wrote:

> Hi,
> 
> At Wed, 4 Apr 2007 06:01:21 +0900,
> Charles Oliver Nutter wrote in [ruby-core:10853]:
> > Is there a historical reason why I can't do something like these:
> > 
> > x = String
> > class x; end
        [...] 
> If there were can be an arbitrary expression, it conflicts
> with the superclass notation.  Consider:
> 
>   class X < String
> 
> How do you see the above, X inherits String, or comparison
> between X and String?  We concluded that parentheses around the
> expression for a while ago.

Interesting.   String < Object gives true,  Object < String -> false
Fixnum < String -> nil, i.e, inheritance comparisons.  So handling
an arbitrary expression is pretty tricky, given that classes can be
reopened:
irb(main):007:0> class Wibble < Array ; end
=> nil
irb(main):008:0> class Wibble < Array ; end
=> nil
irb(main):009:0> Wibble
=> Wibble
irb(main):010:0> Wibble < Array
=> true
irb(main):011:0> Array < Wibble
=> false
irb(main):012:0>

and class has to be a keyword because the present syntax combinations
don't work as syntax sugar for a method call
  class X
  class Y < Z
  class  << q

mean it can't map to some fictional method :-
Kernel::open_possibly_reopen_class(klass, superklass=nil)
because we can't leave klass out, and yet have superklass.

So maybe class X [< Y] could be changed to allow class (expr) [ <
(expr)] provided the parentheses are present unless the expressions are
syntactically constants, but this is another case where somebody
has to persuade yacc to to this.  [Is anyone collecting these cases
where we can't do something because it is a pain to make yacc do it?]

Anyway, this makes me appreciate syntax I'd been taking for granted.

Also makes me think: what about non-anonymous singleton classes?

irb(main):002:0> class X << x
irb(main):003:1>   def hello
irb(main):004:2>     puts "hi"
irb(main):005:2>   end
irb(main):006:1> end
SyntaxError: compile error
(irb):2: syntax error, unexpected tLSHFT, expecting '<' or '\n' or ';'
class X << x
          ^
        from (irb):6
        from :0
irb(main):007:0>

Fair enough! :-)  That would produce some weird prototype based OO
if it were allowed, though.

> > The reason I ask is for something in JRuby. In JRuby we can refer to 
> > Java classes using a long-hand syntax:
> > 
> > java.lang.System
> 
> Hmmm, I'm interested in how the conflict is solved.
> 
> -- 
> Nobu Nakada
> 
> 
        Hugh