Array literals REALLY should be immutable
Denis Koroskin
2korden at gmail.com
Thu Nov 12 05:51:46 PST 2009
On Thu, 12 Nov 2009 16:28:05 +0300, Don <nospam at nospam.com> 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.
>
Can't agree more.
I see no problem writing [1, 2, 3].dup; In fact, I can count all the uses
of *dynamic* array literals on the fingers of one hand. I mostly need then
for either indexing or iteration so the contents is read-only.
I strongly believe that "No hidden allocation" policy should be adopted by
D/Phobos (it is already adopted by Tango with a great success).
More information about the Digitalmars-d
mailing list