【D言語】UDAが登場!!使い方を探ってみる!!
D言語erの皆さん、こんにちは。 今回は、最近になって、なぜかウォルたんによって実装された新たな機能である、UDAの使い方について少し書いていきます。
UDAとは?
User Defined Attributesの略です。 シンボルにいろいろな情報を付け加えることができます。 詳しくは、ここを参照してください。 現在は、dmdのgitリポジトリのheadをビルドしたり、DPasteを使うことによって、UDAを試すことができます。
Serializable
型がシリアライズ可能であることの保証を、UDAで表現できます。
import std.typetuple;
template isSerializable(T){
enum isSerializable = staticIndexOf!("Serializable", __traits(getAttributes, T)) != -1;
}
class A{}
class B{}
pragma(msg, isSerializable!A); // true
pragma(msg, isSerializable!B); // false
void main(){}
std.typetuple.staticIndexOfを使って、UDAに"Serializable"が含まれているか判定しています。
しかし、std.typetuple.staticIndexOfなのに、ExpressionTupleの検索ができるとは、これ如何に・・・
CTFEable
同じく、関数がCTFEableであることの保証も、UDAで表現できます。
import std.typetuple, std.traits;
ReturnType!func safeCall(alias func)(ParameterTypeTuple!func args){
if(ctfe){
static if(staticIndexOf!("CTFEable", traits(getAttributes, func)) != -1){
return func(args);
}else{
assert(0, "unsafe function call");
}
}else{
return func(args);
}
}
int add(int a, int b){ return a + b; }
int mul(int a, int b){ return a * b; }
pragma(msg, safeCall!add(2, 3)); // 5;
pragma(msg, safeCall!mul(2, 3)); // Error: "unsafe function call"
UDAとして"CTFEable"を含んでいる時のみ関数を呼んでいます。
まとめ
UDAは、つい先日実装されたばかりです。
色々と考えて見ましたが、自分はあまり他言語に詳しくないので、思いついた使い方はこのくらいでした。
これの使い方を見ると、UDAはあまり役に立ちそうには見えませんが、
他の言語での使われ方などを参考に、これからいろんな使い方が見つかると思います。
楽しみですね。
担当:美馬(機能追加なんて何ヶ月ぶりだろう・・・)