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