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

Luhrel lucien.perregaux at gmail.com
Fri Jan 8 14:07:29 UTC 2021


 From the feedback thread:

On Friday, 8 January 2021 at 00:57:37 UTC, Q. Schroll wrote:
> 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][]


I really don't like the `.staticArray` because it's non-esthetic. 
I don't know if it's really argument, mainly because it's very 
personal.


>
> 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.
>

Good point.

> 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]));
>

Correct. I'll rewrite this example.
There should be a type conversion:

```
int[2] bar() { return [1,2]; }
long[$] a6 = bar();  // implicit conversion
static assert(is(typeof(a6) == long[2]));
```

Now it makes more sense.

> 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.

:scratching my head:

> B. The DIP says that int[2] and int[$] may end up the same 
> thing, but document different intent.

wtf. No ?

> 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.

The previous attempt was reverted because of control-flow 
analysis that was needed.

> There could be much better examples.

Yes.

> 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.

I don't think, it's an old feature. Even BCPL had it.

> 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.

If I implement it, would people more agree with the DIP ?
For me it's a nonsense (and a waste of time, if the DIP is not 
accepted).




More information about the Digitalmars-d-announce mailing list