On Thursday, 27 March 2014 at 17:30:58 UTC, Simen Kjærås wrote:
Ah, true. Call it an enhancement request, then. Wanting to alias a function literal like that is so common the language should support it.

--
  Simen

It's a bit unintuitive as to what works and what doesn't (although it makes sense for the most part).

//No good
alias fun = a => a + 1;
alias fun = (int a) => a + 1;
//Ok
alias fun = unaryFun!(a => a + 1);
alias fun = unaryFun!((int a) => a + 1);

//Doesn't work
enum fun = a => a + 1;
enum fun = unaryFun!(a => a + 1);
//Works
enum fun = (int a) => a + 1;
enum fun = unaryFun!((int a) => a + 1);


But the fun is just beginning. Now we can mix in template aliases and enums.

//Chokes
alias fun() = a => a + 1;
alias fun() = (a => a + 1);
alias fun() = (int a) => a + 1;
alias fun(T) = a => a + 1;
alias fun(T) = (a => a + 1);
alias fun(T) = (int a) => a + 1;

//Fine
alias fun() = unaryFun!(a => a + 1);

//Compiles but fails when fun is called
alias fun() = unaryFun!((int a) => a + 1);
fun(1); //undefined reference to `_D4f2924mainFZv8__T3funZ9__lambda2FNaNbNfiZi'

enum fun() = unaryFun!(a => a + 1);
fun(1); //cannot infer type from template template __lambda2

enum fun() = unaryFun!((int a) => a + 1);
fun(1); //cannot deduce function from argument types !()(int)

enum fun() = a => a + 1;
fun(1); //type void is inferred from initializer a => a + 1

enum fun() = (int a) => a + 1;
fun(1); //cannot deduce function from argument types !()(int)


So there you have it.




Reply via email to