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