Ary Borenszweig escribió:
Lutger escribió:
bearophile wrote:
...
The second problem is that compile-time functions are nicer, so I'd
like to not use templates when possible. But the following code
doesn't work at compile time, can you tell me why? (I have had to use a
not nice temporary struct to return the static array)
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;
}
Bye and thank you,
bearophile
I'm not sure why, this code does work:
int[] genSquares(int N)()
{
int[] a;
for (int i = 0; i < N; i++)
{
int n = i;
int m = 0;
while (n)
{
int digit = n % 10;
n /= 10;
m += digit * digit;
}
a~=m;
}
return a;
}
void main() {
enum int CHUNK = 1000;
enum int[CHUNK] squares = genSquares!(CHUNK)();
}
However, it fails as soon as I try do use indexing or set the length
of an array. I thought these operations were supposed to be legal,
perhaps it is a bug.
I just debugged it with Descent, and it seems the static array is the
problem. It can't be interpreted. But doing this works:
---
struct S(int N) { int[] a; }
...
s.a ~= m;
---
I think static arrays don't work in compile-time functions. Like, you
can't return one from a function, so that might be the problem, I don't
know.
BTW, I had to debug inside Descent's code to find this. If I debug it
using the debugger I'm programming, I can see it stops the execution
right at the "s.a[i] = m;" line, without saying why (DMD doesn't say
why). It's not much, but I think it's better than "Can't evaluate at
compile-time", and might give you more clues about it. :-)