Array literals MUST be immutable.

Don nospam at nospam.com
Wed Feb 17 00:47:00 PST 2010


This is for me the last remaining D2 issue.
I've mentioned this several times before. Mutable array 'literals' are 
wrong on so many levels. Here are some of the issues, listed in 
decreasing importance.

(1) The language has no syntax for immutable array literals.
   [1,2,3] is mutable. You can created an immutable literal using the 
awful 'static const' syntax, but that only works for named literals.

(2) Concurrency issues make (1) even more important. It ought to 
possible to pass an array (defined at compile time) as a message.

(3) Performance of the existing array 'literals' is absolutely 
appalling. I doubled the speed of my entire app by changing ONE array 
declaration from 'immutable [] xxx' into 'static const [] xxx'!!!
Right now, if an array literal appears in your code, chances are it's a 
performance bug. It's deceptive that there's a hidden heap allocation 
happening in every array literal. It's got no business being in a 
systems language IMHO.

(4) It is unintuitive. "hello" is immutable, but ['h','e','l','l','o'] 
is not???

(5) It's trivial (a one-liner) to make a function to create a mutable 
array literal. We don't need it in the language.

Mutable arrays literals are common in toy examples, but they've got very 
little real-world relevance. By contrast, immutable array literals are 
used in lookup tables all the time. They are extremely common. We need 
to be able to express them.

This is the only remaining thing in D2 which I'm certain is a big 
mistake. Of course there's ugliness in various places, but it's possible 
to ignore them or work around them. This is a primitive, 
bread-and-butter issue with no workaround.



More information about the Digitalmars-d mailing list