On Thursday 30 September 2010 12:14:09 Sebastian Schuberth wrote:
> Hi,
> 
> I'm still playing around with DMD 2.049 and my Vector struct. This
> 
> struct Vector(alias N,T)
> {
>      static immutable Vector X=Vector(1,0,0);
> 
>      this(T[N] v ...) {
>          data=v;
>      }
> 
>      T data[N];
> };
> 
> alias Vector!(3,float) Vec3f;
> 
> gives
> 
> Error 1       Error: Slice operation this.data[] = cast(const(float[]))v
> cannot be evaluated at compile time           main.d  6
> 
> I also tried simply
> 
> struct Vector(alias N,T)
> {
>      static immutable Vector X=Vector(1,0,0);
> 
>      this(T x,T y,T z) {
>          data[0]=x;
>          data[1]=y;
>          data[2]=z;
>      }
> 
>      T data[N];
> };
> 
> alias Vector!(3,float) Vec3f;
> 
> but that gives
> 
> Error 1       Error: Index assignment this.data[0u] = x is not yet supported
> in CTFE               main.d  6
> Error 2       Error: Index assignment this.data[1u] = y is not yet supported
> in CTFE               main.d  7
> Error 3       Error: Index assignment this.data[2u] = z is not yet supported
> in CTFE               main.d  8
> 
> Any other ideas how to introduce such an "X" constant?
> 
> Thanks.

You could initialized it in a static constructor. e.g.

static this()
{
        X = Vector(1, 0, 0);
}

By the way, it's a bit atypical in D at this point to declare constants in all 
caps - primarily because you often end up with so many in your code that it can 
get pretty ugly to have so many variables in all caps.

Also, assuming that you could initialize the variable at compile-time (which 
you 
obviously having trouble doing here), the typical way to declare such a 
constant 
is not to use static but rather enum. e.g.

enum x = Vector(1, 0, 0);

However, since you can't initialize this particular variable at compile-time as 
it stands, a static variable would be the correct way to go here.

Also, if you declare a variable immutable and initialize directly (as opposed 
to 
using a destructor), you don't have to include the type (just like you don't 
have to include the type for enum). Of course, since you need a static 
constructor here, it won't work here, but I thought that I'd let you know.

- Jonathan M Davis

Reply via email to