On Tuesday, 12 December 2017 at 09:48:09 UTC, Jonathan M Davis wrote:
On Tuesday, December 12, 2017 07:33:47 Ivan Trombley via Digitalmars-d-learn wrote:
Is there some way that I can make this array immutable?

   static float[256] ga = void;
   static foreach (i; 0 .. 256)
       ga[i] = (i / 255.0f) ^^ (1 / 2.2f);

If you want anything to be immutable, you either have to initialize it directly or give it a value in a static constructor (and the static constructor solution won't work for local variables). So, you'd need to do something like

static immutable float[256] ga = someFuncThatGeneratesGA();

If the function is pure, and there's no way that the return value was passed to the function, then its return value can be assigned to something of any mutability, since the compiler knows that there are no other references to it, and it can implicitly cast it, or if the type is a value type (as in this case), then you just get a copy, and mutability isn't an issue. Alternatively to using a pure function, you can use std.exception.assumeUnique to cast to immutable, but that relies on you being sure that there are no other references to the data, and it may not work at compile-time, since casting is a lot more restrictive during CTFE. So, in general, using a pure function is preferable to assumeUnique.

- Jonathan M Davis

Ah, it doesn't work. I get this error using the ^^ operator:

/usr/include/dmd/phobos/std/math.d(5724,27): Error: cannot convert &real to ubyte* at compile time /usr/include/dmd/phobos/std/math.d(6629,24): called from here: signbit(x) /usr/include/dmd/phobos/std/math.d(6756,16): called from here: impl(cast(real)x, cast(real)y)

:(

Reply via email to