CT aggregate computations

Adam D. Ruppe via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Mar 30 11:37:32 PDT 2017


On Thursday, 30 March 2017 at 18:21:43 UTC, Enigma wrote:
> I am using foreach and it seems to be done dynamically as I can 
> step through the code for each value and see them change. This 
> tells me it is not done at compile time like it should be.

Remember two facts:

1) CTFE is never done unless it specifically must be done

and

2) D does not have static foreach, it is just regular foreach


And a third warning:

* enum foo = [1,2,3]; makes foo work just like an array 
literal... which means it actually does a runtime allocation 
every time you reference it. Rarely what you actually want!


The answer is simple though: write an ordinary function that does 
your calculation and pass it an ordinary array, but set it to a 
static immutable array to force CTFE.

int getMax(int[] X) {
       int y = 0;
       foreach(x; X)
          y = max(x, y);
       return y;
}

void main() {
    enum y = getMax([1,2,3,4,5]); // safe for int
    static immutable y = getMax(...); // use that if return array
}



So you need to do a regular loop in a regular function, then 
assign the result of that regular function to enum or static.


More information about the Digitalmars-d-learn mailing list