Template limits in D2
Ary Borenszweig
ary at esperanto.org.ar
Sun May 24 09:30:21 PDT 2009
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. :-)
More information about the Digitalmars-d-learn
mailing list