kubo39's blog

ただの雑記です。

D言語の静的配列のちょっとかわった挙動

以下のコードの振る舞いはちょっと変わった感じをうけるかもしれない。

int[2] ARR = [5];

void main()
{
    // int[2] arr = [5]; // Error: mismatched array lengths, 2 and 1
    assert(ARR == [5, 0]);
}

この場合、D言語の静的配列はグローバルに宣言した場合は初期化(ArrayInitializer)として意味解析を行い、ローカルの場合は式(AssignExpression)の文脈で意味解析を行う。 これは構文上問題はないのだが意味論は定義されていないし、ぱっと見た感じ不自然な挙動に思える。 ここでもしエラーにする場合、単純にローカルと同じように扱ってしまえばいいのではと思うが、DのArrayInitializerで評価可能な構文に以下のようなものがある。

int[4] arr = [1:2]; // [0, 2, 0, 0]

これは現在(dmd-2.081.1)意味解析上で先のグローバルな配列宣言と区別することができないので、仮にエラーとする場合はおそらく構文解析に手を入れる必要があると思われる。

追記

実際試してみるとパーサいじる必要はなくすんなり修正できる。しかし、これなんて言って報告すればいいんだろう。