On 4/4/07, Hugh Sasse <hgs / dmu.ac.uk> wrote: > 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 > > Intrestingly, you can do things like this: >> a = Object.new => #<Object:0x13292e4> >> b = class <<a >> attr_accessor :name >> self >> end => #<Class:#<Object:0x13292e4>> >> b => #<Class:#<Object:0x13292e4>> >> A = b => #<Class:#<Object:0x13292e4>> >> A => #<Class:#<Object:0x13292e4>> With singletons. Which allows you to do things like: >> ObjectSpace.each_object(A) { |a| p a } #<Object:0x13292e4> => 1 -- Chris Carter concentrationstudios.com brynmawrcs.com