Thread overview
Re: alias with lambda syntax: alias fun2=a=>fun(a);
Jun 05, 2014
Timothee Cour
Jun 05, 2014
Artur Skawina
Jun 05, 2014
Artur Skawina
June 05, 2014
ok I remembered we can use std.typetuple.Alias for that.


On Wed, Jun 4, 2014 at 11:58 PM, Timothee Cour <thelastmammoth@gmail.com> wrote:

> Is there a way to do this?
>
> import std.algorithm;
>
> auto fun(T)(T a){return a;}
>
> template fun2(T){auto fun2(T a){return fun(a);}}//OK but heavy syntax and
> cannot be nested inside test()
>
> void main(){
>   //alias fun2=fun!int; //OK but needs to specify template params
>   //none of those work:
>   //alias fun2=a=>fun(a);
>   //alias fun2(T)=(T a)=>fun(a);
>   //alias fun2(T)=(T a){return fun(a);}
>   auto b=[1].map!fun2;
>   assert(b.equal([1]));
> }
>
>


June 05, 2014
On 06/05/14 08:58, Timothee Cour via Digitalmars-d-learn wrote:
> Is there a way to do this?
> 
> auto fun(T)(T a){return a;}
> 
> template fun2(T){auto fun2(T a){return fun(a);}}//OK but heavy syntax and cannot be nested inside test()

   alias fun2(T) = fun!T;

But this will prevent IFTI, so you'd either need to use 'fun2!int' or introduce another alias ...

> void main(){
>   //alias fun2=fun!int; //OK but needs to specify template params

... like this one.

If you want the params inferred, then

   static auto ref fun2(A...)(A a) { return fun(a); }

will mostly work. [1]

>   //none of those work:
>   //alias fun2=a=>fun(a);
>   //alias fun2(T)=(T a)=>fun(a);
>   //alias fun2(T)=(T a){return fun(a);}
>   auto b=[1].map!fun2;
>   assert(b.equal([1]));
> }
> 

artur

[1] no perfect forwarding; there's no terse way to do that in D.
June 05, 2014
> On 06/05/14 08:58, Timothee Cour via Digitalmars-d-learn wrote:

>>   //none of those work:
>>   //alias fun2=a=>fun(a);

  alias fun2=ALIAS!(a=>fun(a));

That 'ALIAS' template will need to be in module scope.

  alias ALIAS(alias A) = A;

artur