Lazy functions, lazy arrays

Dennis Ritchie via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 20 09:01:50 PDT 2015


On Friday, 20 March 2015 at 14:27:06 UTC, John Colvin wrote:
> I made a mistake about the static variable and thread-local 
> storage.
>
> immutable(int)[] factorials()() @property
> {
>     static immutable int[N] results = memoizeFactorials(N);
>     return results[];
> }
>
> is the correct way to do it if you have to.
>
> Still, it's totally not worth doing for such a short array.

Thank you, but I can not figure out how I do this:

import std.stdio;

enum N = 12;

immutable(int)[] factorials()() @property
{
     static immutable int[N] results = memoizeFactorials(N);
     return results[];
}

int[] memoizeFactorials(int n)
{
     if (!__ctfe)
         // Make sure that this function is never called at run 
time
		assert(false);

     int[] result = new int[n];

     result[0] = 1;

     foreach (i; 1 .. n)
         result[i] = result[i - 1] * i;

     return result;
}

void main()
{
	bool flag;
	if (flag) {
		factorials();
		writeln(factorials[10]); // 3628800
	}
	else
		writeln(factorials[10]); // range violation(35)
}


More information about the Digitalmars-d-learn mailing list