Thread overview
foreach on a tuple in CTF
Apr 24, 2007
Max Samukha
Apr 26, 2007
Max Samukha
May 02, 2007
bc
April 24, 2007
Why the function cannot be evaluated at compile time? Is it a bug?

import std.stdio;

char[] foo(A...)()
{
    char[] s = "";

    foreach (i, v; A)
    {
        static if (i == 1)
            s = i.stringof;
    }

    return s;
}

void main(char[][] args)
{
    alias foo!("test", 100) f;

    writefln(f());		// works
    pragma(msg, f());	// error: cannot evaluate at compile time
}
April 24, 2007
Max Samukha wrote:
> Why the function cannot be evaluated at compile time? Is it a bug?
> 
> import std.stdio;
> 
> char[] foo(A...)()
> {
>     char[] s = "";
> 
>     foreach (i, v; A)
>     {
>         static if (i == 1)
>             s = i.stringof;
>     }
> 
>     return s;
> }
> 
> void main(char[][] args)
> {
>     alias foo!("test", 100) f;
> 
>     writefln(f());		// works
>     pragma(msg, f());	// error: cannot evaluate at compile time
> }

Probably this is a bug too. I haven't really used CTFE much yet, but here's a smaller version of the above that triggers the same error msg with dmd 1.013

  char[] foo(A...)()
  {
    foreach (i, v; A) {}
    return "";
  }

  pragma(msg, foo!("a")());   // error

It works if you remove the index part from the foreach or change "a" to e.g. 42.
April 24, 2007
Jari-Matti Mäkelä wrote:
> Max Samukha wrote:
>> Why the function cannot be evaluated at compile time? Is it a bug?
>>
>> import std.stdio;
>>
>> char[] foo(A...)()
>> {
>>     char[] s = "";
>>
>>     foreach (i, v; A)
>>     {
>>         static if (i == 1)
>>             s = i.stringof;
>>     }
>>
>>     return s;
>> }
>>
>> void main(char[][] args)
>> {
>>     alias foo!("test", 100) f;
>>
>>     writefln(f());		// works
>>     pragma(msg, f());	// error: cannot evaluate at compile time
>> }
> 
> Probably this is a bug too. I haven't really used CTFE much yet, but here's a smaller version of the above that triggers the same error msg with dmd 1.013
> 
>   char[] foo(A...)()
>   {
>     foreach (i, v; A) {}
>     return "";
>   }
> 
>   pragma(msg, foo!("a")());   // error
> 
> It works if you remove the index part from the foreach or change "a" to e.g. 42.

Actually dmd having so many bugs in tuples and type inference makes me wonder if Walter really knows the best way to implement these. I mean many language docs just state that they use the Hindley-Milner algorithm and everything just seems to work. I'm sure these are not easy to implement, but I just had to ask this.
April 26, 2007
On Wed, 25 Apr 2007 02:43:24 +0300, Jari-Matti Makela <jmjmak@utu.fi.invalid> wrote:

>Jari-Matti Makela wrote:
>> Max Samukha wrote:
>>> Why the function cannot be evaluated at compile time? Is it a bug?
>>>
>>> import std.stdio;
>>>
>>> char[] foo(A...)()
>>> {
>>>     char[] s = "";
>>>
>>>     foreach (i, v; A)
>>>     {
>>>         static if (i == 1)
>>>             s = i.stringof;
>>>     }
>>>
>>>     return s;
>>> }
>>>
>>> void main(char[][] args)
>>> {
>>>     alias foo!("test", 100) f;
>>>
>>>     writefln(f());		// works
>>>     pragma(msg, f());	// error: cannot evaluate at compile time
>>> }
>> 
>> Probably this is a bug too. I haven't really used CTFE much yet, but here's a smaller version of the above that triggers the same error msg with dmd 1.013
>> 
>>   char[] foo(A...)()
>>   {
>>     foreach (i, v; A) {}
>>     return "";
>>   }
>> 
>>   pragma(msg, foo!("a")());   // error
>> 
>> It works if you remove the index part from the foreach or change "a" to e.g. 42.
>
>Actually dmd having so many bugs in tuples and type inference makes me wonder if Walter really knows the best way to implement these. I mean many language docs just state that they use the Hindley-Milner algorithm and everything just seems to work. I'm sure these are not easy to implement, but I just had to ask this.

I know absolutely nothing about how tuples and type inference can be implemented, so would you please ask this in D NG (Walter does not seem to give much attention to D.learn)? It would be interesting to know Walter's or other experts' answers.

I won't post those bugs because many of them seem to be related. Hopefully, they will be fixed in the next release.
May 02, 2007
On Thu, 26 Apr 2007 09:20:58 +0100, Max Samukha <samukha@voliacable.com> wrote:

>>
>> Actually dmd having so many bugs in tuples and type inference makes me
>> wonder if Walter really knows the best way to implement these. I mean
>> many language docs just state that they use the Hindley-Milner algorithm
>> and everything just seems to work. I'm sure these are not easy to
>> implement, but I just had to ask this.
>
> I know absolutely nothing about how tuples and type inference can be
> implemented, so would you please ask this in D NG (Walter does not
> seem to give much attention to D.learn)? It would be interesting to
> know Walter's or other experts' answers.
>
> I won't post those bugs because many of them seem to be related.
> Hopefully, they will be fixed in the next release.

i'm curious about this. doesn't hindley-milner type inference require that you
implement a simple(ish) version of prolog?