Array literals' default type

Don nospam at nospam.com
Fri Oct 9 06:27:01 PDT 2009


Steven Schveighoffer wrote:
> On Fri, 09 Oct 2009 08:34:31 -0400, Don <nospam at nospam.com> wrote:
> 
>>
>> I don't understand why runtime-determined array literals even exist.
>> They're not literals!!!
>> They cause no end of trouble. IMHO we'd be *much* better off without 
>> them.
> 
> I don't agree.  Here is a runtime decided array literal:
> 
> void foo(int a, int b, int c)
> {
> auto x = [a, b, c];
> }
> 
> The alternatives are:

> // template function
> 
> auto x = createArray(a, b, c);
> 
> // mixin?
> 
> Although the template function looks nice, it adds bloat.

There's no bloat. You just need a type-safe variadic.
T[] createArray(T)(T[] args...);

One function per type. That's the best you're ever going to do with 
run-time construction anyway.
Actually, there's horrific bloat present right now. Look at the code 
generated when you use an array literal.

> Why shouldn't the compiler just do what you want it to do?  I 
> don't see a  lot of ambiguity in the statement above, "I want an array 
> of a, b, and c together please".  It's obvious what to do, and the code 
> looks clean.

There's ambiguity once you leave the simplest cases. See below.

> 
> On top of that, what if a, b, and c are runtime decide, then during 
> development, or with a new compiler, they can now be CTFE decided?  Now 
> you are calling some function when they *could* be in a literal.

This is exactly the problem.
They should ALWAYS require CTFE evaluation.

EG:
immutable(double)[] tableOfSines = [ sin(0.0), sin(PI/4), sin(PI/2), 
sin(3*PI/4), sin(1)];

Obviously, these values should be be compile-time evaluated. But how 
does the compiler know that? It can't.
Right now, this is done at run-time.

Runtime array creation is a prime candidate for moving from language to 
libraries.



More information about the Digitalmars-d mailing list