metaclassをchange-classで変えようとしたら怒られた
gosh> (define-class <hoge> () ()) <hoge> gosh> (define-class <hoge-meta> (<class>) ()) <hoge-meta> gosh> (change-class <hoge> <hoge-meta>) *** ERROR: %transplant-instance: classes are incompatible between #<class #f> and #<class <hoge>> Stack Trace: _______________________________________ 0 (%transplant-instance! new obj) At line 159 of "/usr/local/share/gauche/0.8.14/lib/gauche/redefutil.scm"
なんで怒られるのかよくわからない.base classが違うとtransplantできないらしい.klassのbase classというのはklass->cpaの中で最初にSCM_CLASS_CATEGORY(k)==SCM_CLASS_BASEを満たすkで,Cレベルで定義されるクラスの一種で…俺は何を言っているんだろう.
これは実装上の制限か何かなんだろうか.
gosh> (define-class <hoge> () ()) <hoge> gosh> (define-class <hoge-meta> (<class>) ()) <hoge-meta> gosh> (define-class <hoge> () () :metaclass <hoge-meta>) <hoge> gosh> (class-of <hoge>) #<class <hoge-meta>>
これはやってることが違う.