URubyの作り方

ホントは他に作りたいものがあったんだけど、どうしても動かなくて諦めました。間に合わせででっち上げたのでかなり手抜き・・・。

variable.c

static void 
mod_av_set(VALUE klass, ID id, VALUE val, int isconst)
{
    // ..snip..
            if ((VALUE)value == Qundef)
                autoload_delete(klass, id); 
            else if (val == Qnil) {
                autoload_delete(klass, id); 
                rb_funcall(value, rb_intern("undef_class"), 0, 0);
            }    
            else 
                rb_warn("already initialized %s %s", dest, rb_id2name(id));
    // ..snip..    
}

定数にnilが代入されたときにundef_classメソッド呼ぶだけ。最初はst_delete(rb_class_tbl, id, 0);とかやろうとしたけど落ちまくるので・・・。

undef_classの実装はprelude.rbの中。

prelude.rb

class RubyVM
  def self.undef_class
    sleep   
    exit        
  end           
end             

class Object
  def self.undef_class
    eval %Q{
      def self.inherited(subclass)
        raise "#{self.name} does not exists."
      end       
    }   
    
    self.included_modules.each do |mod|
      (mod.singleton_methods - [:raise]).each do |m|
        undef_method m
      end
    end

    (self.instance_methods - (self.superclass.instance_methods rescue [])).each do |m|
      undef_method m
    end

    undef_method :initialize
    define_method :initialize do
      raise "#{self.name} does not exists."
    end  
  end
end

うん。ショボイね。来年はもうちょっと頑張るよ。