【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先生に解決して欲しい所ですね。