【D言語】dmd 2.060 のリリース
先日、dmd 2.060がリリースされました。 ChangeLogを読んで、気になった項目について詳しく解説していきます。
新機能/変更された機能
- std.container: Added DList, which is an implementation of a doubly-linked list.
ようやく、std.containerにDListという双方向連結リストが実装されました。 これで、D言語でStackやQueueを使いたい時、わざわざ自分で実装する必要がなくなりました。
- std.traits: Added KeyType, ValueType, isScalarType, isBasicType, and SetFunctionAttributes templates.
KeyTypeやValueTypeは、名前の通り連想配列のKeyの型とValueの型をそれぞれ取り出すテンプレートで、それらがstd.traitsに追加されました。 SetFunctionAttributesは、渡された関数に指定したリンケージ、属性を追加した関数を返すテンプレートです。 サンプルコードを見る限り、assumePureのようなことが出来るようです。 これはかなり面白そうなので、後の記事でソースコードを読んで見る予定です。
- Bugzilla 8105: in ref
関数の引数の属性であるinとrefが同時に指定できるようになりました。 もともと、inはconst scopeの省略であり、scopeはrefと一緒に使えないという制約のせいでinとrefは同時に指定できませんでした。 今回の変更で、in refの場合だけ特別に許可されるようになったらしく、とにかくin refと指定できるようになりました。
バグ修正
多すぎるので、私が報告したバグのみ取り上げます。
- Bugzilla 8038: #line which is in a double template instantiation doesn't work
これは、以下のようなコード
template t(T){
alias T t;
}
t!(#line 128
t!(
int
)
) i;
はコンパイルが通るのに対し、以下のようなコード
template t(T){
alias T t;
}
t!(
t!(#line 128
int
)
) i;
は何故かコンパイルが通らないというバグです。 テンプレートのインスタンス化の中にあるテンプレートのインスタンス化の中に、#lineが存在するのが原因です。
lineをこんなにも駆使する人は少ないと思うので、こんな簡単なバグでも見つかるのが遅れたのでしょうか。
実は、#lineは、mixinやtemplate mixinによるコンパイル時メタプログラミングをしている人にとって、エラーメッセージを分かりやすくする手段の一つです。
lineについては、後の記事で詳しく書く予定です。
まとめ
ChangeLogを読んで、解説してきました。 今回のリリースも、バグ修正の量がかなり多く、これはこれでいい傾向なような気がします。 とりあえず、早めにCTFEのメモリ関連の問題をDon先生に解決して欲しい所ですね。