Mixin
が来るらしい。寝て起きたら世界が動いてたっつうかみんな反応はええ。(特に翻訳)
- http://pc5.2ch.net/test/read.cgi/tech/1079068715/421
- http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D/1230
- http://www.kmonos.net/alang/d/mixin.html
- http://d.hatena.ne.jp/ytqwerty/20040516#p1
単一継承だってことがこれで弱点ではなくなった、か。
ええと…
template Buzzable(alias buzzRadius) { // ... } class Character {} class Shot : Character { } class PlayerShot : Shot { } class EnemyShot : Shot { static int buzzRadius = 5; mixin Buzzable(buzzRadius); } class Enemy : Character { static int buzzRadius = 10; mixin Buzzable(buzzRadius); }
あーまあこれができるだけでもとりあえずいい気がしてきた。パラメータ取れるってことはなんかいろいろわけわからんこともできそうな気もするし。
あーひょっとしてこんなのできる?なにぶんコンパイラが無いのでマジメには書かないけど。
class Alias2Type(alias a) {} template AliasList // ... の定義はめんどうなのでここには書かない template Printable(alias AliasList) { // ... AliasList を使って print メソッドを作る。 // alias から symbol 名受けとれれば楽しいことになりそう、か。 } class Class { static int i; static char c; static char[] str; mixin Printable!(AliasList!(i, c, str)); } void test() { Class c = new Class; c.print(); }
まー static 変数しかできないしそもそも static 変数は OK って仕様に書いてないのだけれども。(static const だとコンパイラ落ちるし。これに限らず static const はコンパイラが異様な動きしますよね)
スコープに関して追記。 YT さんへのコメントとして書こうかと思ったんだけどコード書きたくなったのでこっちで。
http://d.hatena.ne.jp/ytqwerty/20040516#p1 から。
def a "global" end module M def f a end end class C include M def a "local" end end c = C.new print "#{c.f}\n"
Ruby でこう書くと当然のように local と表示されるわけでして、ていうか Mix-in てこういうものだと思うんですよね。 Self なり CLOS なりのがどうなってるか知らないのですけど。こうでないと Enumerable とか定義しにくいわけでして。
なんて書いてたら K.INABA さんがつっこんではるねえ。常に数十歩は先を行かれている方だ。
で…そういうこと考えてるとやはり Delphi の interface-implements という機構はよくできたもんなのかなあ、と。でも D の芸風と微妙に違う気がするんだよねえ。 C++ 的な悪用厳禁ツール群をちょっと安全方向に倒すものの、汎用性に色気を出して完全に安全一辺倒にはせんというか。ああ言語化できてない。
まあどんなものであれ、 この段階(半年近く前かよ…) で Mixin が入ると思ってなかったので嬉しいのです。多重継承好きな人間としては。だいたいあの時既に D に対して過大な期待をしないようになっていたので D の現状は十分満足できるものなのですよ。
今 D に欲しいものメモ。 Java 的メンバ初期化、コンパイル時 Reflection 的なもの、 YT さんの言っておられた result 戻り値。あれこんな少なかったっけ。