Do you see a problem here?

import std.stdio: writeln;
int[24] arr = [10,2,15,15,14,12,3,7,13,5,9,9,7,9,9,9,11,15,1,1,12,5,14];
void main() {
    writeln(arr);
}

This code compiles and runs fine, I think according to the D specs, but it can 
hide a bug.

There are three main situations where you use an array literal to define a 
fixed-size array:
1) You want a static array that contains as many items as in the literal. This 
is a common case, maybe the most common in my code. For this I and other people 
have suggested a simple syntax that helps avoid to count the items:
int[$] arr = [10,2,15,15,14,12,3,7,13,5,9,9,7,9,9,9,11,15,1,1,12,5,14];
2) You want an array with N items. In this situation you put N in the type 
definition, on the left as in that 'arr' array. This situation can lead to bugs 
in D code because the compiler accepts literals with a length different from N. 
Changeset 442 fixes part of this situation but I don't know if it fixes the 
whole problem (because it'a a big changeset and I don't understand all the 
things it changes).
(Don has split my bug report to avoid fixing the whole problem. I don't think 
mine is an enhancement request as Don writes, I think it's a bug in the D 
specs.)

The changeset 442:
http://dsource.org/projects/dmd/changeset/442

It's relative to this bug reported by Don:
http://d.puremagic.com/issues/show_bug.cgi?id=3974

That comes from this bug report of mine:
http://d.puremagic.com/issues/show_bug.cgi?id=3849

My opinion is that those two cases cover most situations. So I think it's 
positive to raise errors if the literal has less items than the specified N, 
because that 'arr' literal is likely a bug, it defines trailing zeros in an 
implicit way. As the second item in the Python Zen says: "Explicit is better 
than implicit.". I desire to avoid sources of bugs in D, when possible because 
a programmer wants to give all his/her/hir attention to the more serious 
sources of bugs, like data corruption, database mistakes, etc, instead of 
error-prone minutiae of the language syntax.

A third case is when you really want to define a static array using a literal 
that has less items than the static array. I think this is an uncommon case, 
what are the real use cases of this? But we might want to support it anyway. 
Two examples:

int[4] datas = [1, 2];
int[3][3] mat = [[1,2,3], [4,5,6]];

In D there is another way to write that (using the associative array syntax! 
this smells bad):
int[4] datas = [0:1, 1:2];

Another possibile syntax not currently supported, that I don't like:
int[4] datas = [1, 2,,];

A better and explicit syntax, that uses the * array operator as in Python (this 
mul and concat operations are done at compile-time):
int[4] datas = [1, 2] ~ ([0] * 2);

Or even, using Phobos (this concat operation has to be done at compile-time):
int[4] datas = [1, 2] ~ StaticArr!(2);

Another:
@implicit_filling int[4] datas = [1, 2];
Or:
@implicit_array_filling int[4] datas = [1, 2];

If you have other ideas you can show them.
In practice many things are better than nothing, that is than a silent implicit 
initialization.

Bye,
bearophile

Reply via email to