Array literals REALLY should be immutable
Eldar Insafutdinov
e.insafutdinov at gmail.com
Thu Nov 12 06:18:05 PST 2009
Don Wrote:
> I think this is quite horrible. [1, 2, 3] looks like an array literal,
> but it isn't -- it's an array constructor. It doesn't look like a
> function call. It shouldn't be.
>
> Q1. How do you declare an array literal [1,2,3]?
> A. It took me four attempts before I got it.
>
> ==========================
>
> int main()
> {
> immutable int[] x1 = [1, 2, 3]; // NO - not evaluated at compile time
> static int[] x2 = [1, 2, 3]; // NO - uses thread local storage
> enum int[] x3 = [1, 2, 3]; // NO - not indexable at run time.
>
> static immutable int[] x4 = [1, 2, 3]; // OK
> static const int[] x5 = [1, 2, 3]; // also OK
>
> for (int i=0; i< 3; ++i) {
> if (x4[i]==3) return i;
> }
> return 0;
> }
>
> (x3 is currently accepted, but that's a bug -- the whole point of 'enum'
> is that you can't take the address of it).
>
> This is really ugly and non-intuitive for something so simple. x1 should
> just work.
>
> Q2: How do you create such an array literal and pass it in a function call?
> A. ??? Is this even possible right now?
>
> My code is *full* of these guys. For example, function approximations
> use them (look at any of the special functions code in Tango.math, or
> etc.gamma). Unit tests are full of them. Everyone uses look-up tables.
>
> Bug 2356 is a consequence of this.
>
> By constrast, the stupid array constructors we have now can be
> implemented in a trivial library function:
>
> T[] array(T)(T[] x...) { return x.dup; }
>
> I really don't see how syntax sugar for something so simple can be
> justified, at the expense of basic functionality (lookup tables,
> essentially). Especially when it's creating an inconsistency with string
> literals.
>
I agree too. that will be consistent.
More information about the Digitalmars-d
mailing list