Denis Koroskin wrote:
On Fri, 13 Nov 2009 12:57:52 +0300, Don <[email protected]> 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.
You mean the race condition is not an issue? It is an issue because the
compiler needs to deal with it (perhaps by using thread local
variables!) But the second case is not implemented in DMD anyway.
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.
You're right. Though, it'd be easy to add a null terminator to the end
of memory allocated to char-typed array literals, and make them
identical in every respect.
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.