Array literals REALLY should be immutable

Denis Koroskin 2korden at gmail.com
Fri Nov 13 02:07:37 PST 2009


On Fri, 13 Nov 2009 12:57:52 +0300, Don <nospam at nospam.com> wrote:

> Walter Bright wrote:
>> Don wrote:
>>> Especially when it's creating an inconsistency with string literals.
>>   The inconsistency bothers me, too, but then there's the case:
>>     int x;
>>    ...
>>    [1, 2, x]
>>  That can't be made immutable. Shouldn't it work? There's no analog for  
>> that for string literals, so the inconsistency isn't quite complete.
>
> I don't think it should work.
>
> [1, 2, x] is totally different from, and a far more complicated beast  
> than [1, 2, 3]. [1, 2, x] either allocates memory and performs some form  
> of memory copy, or else it pokes the 'x' value into a half-initialised  
> static array, exposing the code to a possible race condition.

With thread-local-by-default in mind, this is not an issue.

> The latter is just a standard lookup table, that results in no code  
> generation.
> I don't see why these two very different operations should share the  
> same syntax -- they don't actually have much in common.
>
> It'd be nice to able to say that "abcd" and ['a', 'b', 'c', 'd'] are  
> completely identical.
>

They aren't: "abcd" has a null-terminator past the string, and ['a', 'b',  
'c', 'd'] doesn't.

> C++ got away with using the same syntax for these two totally different  
> things, because (1) it doesn't have any kind of constant folding/CTFE,  
> so it can look at the array entries and determine whether it's immutable  
> or not; and (2) it ignores multi-core issues.
>
> The fact that the language doesn't have any syntax for an immutable  
> array literal is really a problem. Some people are getting around it by  
> using a CTFE function to convert all the values to a string literal,  
> then casting that string literal to (say) an array of ints. That's  
> currently the only way to make the compiler generate decent code, and  
> it's quite dreadful.
>
> BTW, I'm pretty sure that making array literals immutable would simplify  
> the compiler. EG, I've noticed that mutable array literals cause many  
> problems for the interpreter.



More information about the Digitalmars-d mailing list