Array literals are weird.

Blatnik blatblatnik at gmail.com
Sat May 1 18:57:48 UTC 2021


On Saturday, 1 May 2021 at 15:14:49 UTC, Mike Parker wrote:
> I strongly disagree. That array literals produce dynamic arrays 
> made sense to me from the day I found D, and it still makes 
> sense 18 years later.

I really can't argue here. If you just want to not think about 
it, then having it always be dynamically allocated is the way to 
go.

But isn't D a systems level programming language where you _do_ 
want to care about things like what is dynamically allocated and 
what isn't? :D

If so then the language should encourage you to allocate 
statically wherever possible. At least in my view.

> If they were to produce static arrays, then what happens here?
>
> ```d
> int[] a = [1, 2, 3];
> return a;
> ```

Well the way I saw my idea working is that the compiler would 
give you a hard error here, and tell you to fix it by allocating 
it with `return a.dup` if that's what you wanted, or make the 
function return a static array if _that's_ what you wanted.

> And what about this?
>
> ```d
> doSomeMatrixStuff3x3(
>     [1.0, 0.0, 0.0,
>      0.0, 1.0, 0.0,
>      0.0, 0.0, 1.0]
> );
> ```
>
> Now I'm passing 9 floats by value unless I remember to do 
> whatever needs to be done to indicate that this should be 
> dynamic (`.dup`).

Unless `doSomeMatrixStuff3x3` does something stupid like copying 
the slice to a global variable, then you don't need to 
dynamically allocate the temporary before you pass it in anyway. 
So if the array literals were static, the compiler would turn the 
call above into something like:

```D
float[9] __temporary = [1, 0, 0, 0, 1, 0, 0, 0, 1];
doSomeMatrixStuff3x3(__temporary[]);
```

This is what you end up doing in -betterC and @nogc anyway, and 
without them this will still save you an unnecessary allocation.

Note that if `doSomeMatrixStuff3x3` _does_ save the slice to a 
global variable or something, that's already incorrect today, as 
you could in theory pass in a stack allocated static array as a 
slice (exactly like it is being called above).

> Moreover, I really would hate to see either `@nogc` or BetterC 
> have any impact on language changes. Those are the 
> *exceptional* cases. D is a GC'ed language. `@nogc` and BetterC 
> are more restricted subsets.

I see your point. This change would make code without @nogc 
slightly more annoying to write because of the error messages 
when you try to do something like the above, which is fine to do 
right now.

But I guess in my view this could be a (slightly) helpful change 
for (every subset of) the language.


More information about the Digitalmars-d mailing list