Template limits
Max Samukha
outer at space.com
Tue May 26 03:00:38 PDT 2009
On Mon, 25 May 2009 14:14:17 -0400, bearophile
<bearophileHUGS at lycos.com> wrote:
>Walter Bright:
>> The problem is that enough recursion will blow up the stack in the
>> compiler. I set a limit below that. But, naturally, for any limit I set
>> someone will try to exceed it.
>
>I accept that some limits exist. For many situations a template nesting of 1000 is plenty. My problems were:
>1) The limit of D1 seems different of the limit of D2, so a program I have written for D1 doesn't work with D2.
>2) Of course I have first tried to write it with CTFE, but I have failed. First I have tried the simple solution:
>
>int[] genSquares(int n) {
> int[] result;
> for (int i = 0; i < n; i++) {
> int k = i;
> int m;
> while (k) {
> int digit = k % 10;
> k /= 10;
> m += digit * digit;
> }
> result ~= m;
> }
> return result;
>}
>
>Then seeing it fail (I cast it into a fixed sized array at compile time), I have tried creating a fixed sized array, but functions can't return them yet. So I have tried to wrap the static array with a struct, but Don has shown this doesn't currently work yet:
>
>struct S(int N) { int[N] a; }
>
>S!(N) genSquares(int N)() {
> S!(N) s;
> for (int i = 0; i < N; i++) {
> int n = i;
> int m = 0;
> while (n) {
> int digit = n % 10;
> n /= 10;
> m += digit * digit;
> }
> s.a[i] = m;
> }
>
> return s;
>}
>void main() {
> const int CHUNK = 1000;
> static const auto squares = genSquares!(CHUNK)().a;
>}
>
>So I have created the mixed template/ctfe version I have shown in my original post.
>So far I have written tons of (sometimes quite complex) templates in D :-)
>
>Max Samukha then has gently offered me a working solution, but it's not obvious, it uses a dynamic array, but builds it in a more functional way.
>
>Bye,
>bearophile
It looks like you can workaround the bug by taking a slice of the
result to "normalize" the array. This works with both compiler
versions:
int[] genSquares(int n) {
int[] result;
for (int i = 0; i < n; i++) {
int k = i;
int m;
while (k) {
int digit = k % 10;
k /= 10;
m += digit * digit;
}
result ~= m;
}
return result[0..n];
}
void main() {
const int CHUNK = 1000;
static const auto squares = cast(int[CHUNK])genSquares(CHUNK);
}
But I'd rather use a dynamic array instead until Don fixes the bug :)
More information about the Digitalmars-d
mailing list