On Wednesday, 29 February 2012 at 16:50:11 UTC, Alex Rønne Petersen wrote:
(Didn't have much luck posting this on dmd-internals, so I'm posting here.)

Hi,

Consider this code:

bool contains(T)(T[] arr, scope bool delegate(T) dg)
in
{
   assert(dg);
}
body
{
   foreach (i; arr)
       if (dg(i))
           return true;

   return false;
}

import std.stdio;

void main()
{
   writeln(contains([1, 2, 3], x => x == 2));
}

This doesn't compile with 2.058; the type of x in the lambda
expression cannot be deduced. Specifying the type explicitly works
fine.

This works:

bool contains(alias dg, T)(T[] arr)
{
   foreach (i; arr)
       if (dg(i))
           return true;

   return false;
}

import std.stdio;

void main()
{
   writeln(contains!(x => x == 2)([1, 2, 3]));
}

Wasn't there supposed to be type inference for delegates passed as
regular parameters in 2.058?

Regards,
Alex

The type inference scenario that didn't work, was supposed to be implemented, and was ultimately added for 2.058 is,

Given this function:

    bool contains(int[] arr, scope bool delegate(int) dg);

You should be able to call it like this:

    contains(arr, x => x == 2);
    // Alternatively,
    contains(arr, (x) { return x == 2; });

This was not previously possible, you had to make the parameter types of those delegates explicit.

There is a bug that sometimes makes this inference crash even with 2.058 though, but I think it might have been fixed for the next release already (I got the same error message as one I saw in a bug report for a recently fixed bug).

Now, it would be nice to have the inference you ask for as well, but I don't believe it's what was talked about.

Of course, you might be referring to conversations I missed...

Reply via email to