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
うん。ショボイね。来年はもうちょっと頑張るよ。