On Thursday, 5 September 2013 at 09:33:00 UTC, John Colvin wrote:
On Thursday, 5 September 2013 at 09:11:06 UTC, John Colvin wrote:
On Thursday, 5 September 2013 at 09:00:27 UTC, John Colvin wrote:
On Tuesday, 3 September 2013 at 11:51:37 UTC, Carl Sturtivant wrote:

I'm confused as to what you're trying to do... your example code is equivalent to

import std.stdio;
int x = 3;
int scale( int s) { return x * s; }
auto f = &scale;
writeln( f(7) );

No it isn't according to dmd.

My code is a minimal piece that produces the same error as some real code. The higher order generic function muddle in the real code is supposed to transform one delegate into another, but I still get the template problem if muddle is the identity function (given here).

My example code isn't equivalent to the above according to the compiler. Why is that? And how can I make it work?

Ok, that makes more sense.

The reason why it doesn't work is that you're effectively asking the compiler to work backwards from {the type of the delegate passed to muddle} to {the type parameters that would have to be used in Dptr to generate that delegate type}. I'm no expert on type-deduction algorithms, but I seriously doubt that's a solvable problem in the general case, especially considering that the definition of Dptr could contain string mixins etc. In the general case, all code is forwards-only.

Anyhow, it's easy to work around:

import std.traits : ReturnType, ParameterTypeTuple;

template Dptr( T, U...) {
        alias T delegate( U args) Dptr;
}

auto muddle( DT)( DT f) {
        alias T = ReturnType!f;
        alias U = ParameterTypeTuple!f;
        //use T and U
        return f; //or make another delegate in real code
}


unittest {
        import std.stdio;
        int x = 3;
        int scale( int s) { return x * s; }
        Dptr!(int,int) f = muddle( &scale);
        writeln( f(7));
}

Having said that, in the case where you explicitly set the template parameters to muddle I think it *should* work and is probably a bug (or at least a simple enhancement) that it doesn't.

I filed a bug report for it
http://d.puremagic.com/issues/show_bug.cgi?id=10969

and only 26.5 mins after posting the bug, there's a pull request to fix it: https://github.com/D-Programming-Language/dmd/pull/2526

That's what I call service :p

Reply via email to