Feedback Thread: DIP 1039--Static Arrays with Inferred Length--Community Review Round 1

Q. Schroll qs.il.paperinik at gmail.com
Fri Jan 8 00:57:37 UTC 2021


The DIP massively fails to provide a good rationale why 
std.array.staticArray is insufficient. It looks unpleasant, but 
does the job in practically all cases demonstrated in the 
examples a1 through a6.

Example a1 currently doesn't work exactly because staticArray 
returns immutable(char)[6], not char[6]. One needs a 
char-specific function that is trivial to write:

     C[n] staticCharArray(C, size_t n)(auto ref const(C)[n] 
charArray)
     {
         return charArray;
     }

Then, example a1 can be written as:
     auto a1 = "cerise".staticCharArray;
     static assert(is(typeof(a1) == char[6]));

Example a2 needs enum, but as long as someone knows what they're 
doing, enum int[] is fine:
     enum int[] d = [1, 2, 3]; // enum instead of const
     auto a2 = d.staticArray;
     static assert(is(typeof(a2) == int[3]));

Example a3 is straightforward the primary use case for 
staticArray:
     auto a3 = [1,2,3].staticArray;

Example a4 is, too.
     auto a4 = [[1,2].staticArray, [3, 4]];
     pragma(msg, typeof(a4)); // int[2][]

Example a5 is the first one that's actually painful to work 
around:
     enum a5DefaultValue = [1,2].staticArray;
     void foo(typeof(a5DefaultValue) a5 = a5DefaultValue)
     {
         static assert(is(typeof(a5) == int[2]));
     }
I think this is rather an argument for allowing type deducted 
defaulted function parameters generally, not only static arrays.

Example a6 is the prime use-case for auto type deduction:
     int[2] bar() { return [1,2]; }
     auto a6 = bar();
     static assert(is(typeof(a6) == int[2]));

This feature would have a reasonable chance of being accepted 
some years ago. Since this is the feedback thread, here's my 
constructive feedback:

A. You maybe need better examples. Ease of reading and writing 
code can be an argument. You may want to state it somewhere. 
Unfortunately, this isn't a very good one. If you can come up 
with examples where workarounds are at least slightly more 
unpleasant than the one for Example a5 (that don't look too 
artificial), it might work out.
B. The DIP says that int[2] and int[$] may end up the same thing, 
but document different intent. IMO, this is the best argument 
this DIP has. An immediate case where this is relevant is as a 
function return type. As an example, opSlice (as the lowering of 
the double-dots in xs[0 .. 1]) returns size_t[2]. It won't ever 
return another number of size_t, so size_t[$] would be wrong 
conceptually. Other functions returning static arrays might 
return T[4], but the 4 isn't particular to the use case. If it 
might change, this can be documented using T[$] so that uses of 
the function don't rely on the 4 too much.
This is merely an example I came up with thinking for a minute. 
There could be much better examples.
C. The DIP really must address the fact that what is gained is 
very minor. Therefore, the difficulty of the implementation and 
its maintenance in the compiler code plays a huge role. If you 
can provide an implementation that most people would agree isn't 
that big of a deal having in the compiler, that would be really 
valuable.


More information about the Digitalmars-d mailing list