Shiro Kawai
shiro****@lava*****
2004年 1月 9日 (金) 06:37:08 JST
From: Masatake YAMATO <jet****@gyve*****> Subject: [Gauche-devel-jp] class method Date: Fri, 09 Jan 2004 02:07:17 +0900 (JST) > 早速質問があります。 > http://www.shiro.dreamhost.com/scheme/gauche/oldnews-j.html > によるとクラスメソッドを定義できるようになったとあるのですが、 > どのようにすれば定義できるのでしょうか? これは、多くの組み込みクラスがデフォルトでユニークなメタクラスを 持っていることを指しています。つまり、<list>クラスに特有のメソッドを 定義するには、そのメタクラスである<list-meta>に対してメソッドを 定義すれば良い、ということです。 (define-method foo ((class <list-meta>)) ...) 例えば、gauche.collectionのいくつかのメソッドはこれを利用して、 結果の値の型をクラスで指定できるようになっています。 (map-to <list> + '(1 2 3) '#(4 5 6)) => (5 7 9) (map-to <vector> + '(1 2 3) '#(4 5 6)) => #(5 7 9) (map-to <u8vector> + '(1 2 3) '#(4 5 6)) => #u8(5 7 9) ただ、ユーザ定義クラスで同様のことをやるには、自分でメタクラスを 作ってやる必要があります。 なお、同様の操作は、CLOSではeql specializerというもので 実現できます。これは引数の型ではなく特定の引数そのもので ディスパッチするというものです。Rubyの特異メソッドみたいなものです。 もともと、クラスに対するメソッドをつけたかったのですが、 eql specializer同等の機構を現在のVMで実装する方法がうまく 思い付かなかったので、この方法(組み込みクラスのメタクラス)を 採用しました。ただ、メタクラスが増えまくってしまうとか、 あまり気に入っていない点もあります。 最近、eql specializer相当のものを効率良く実装できるかも、という 方法を思い付いたので、長期的には「組み込みクラスのメタクラス」から そちらに移行するかもしれません。 --shiro