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