On 01/03/2013 10:54 PM, Michael wrote:
Thanks guys)


auto With(alias fun, I)(I o) // maybe add a template constraint here
{
    static if(isAssignable!(I, typeof(null)))
        return o is null ? null : fun(o);
    else
        return fun(o);
}

foreach(p; persons)
    p.With!(x => x.address);


Now if I want add a somewhat task into expression "x => x.address", for
example "writeln(x.address)", a code should be rewritten like


foreach(p; persons)
    p.With!(x => {writeln(x.address); return x.address;}());


As I understand, right part of expression above - "{ ... }()" is
anonymous function (or delegate, or closure) that immediately called in
lambda expression. Right? Is right behaviour?

You understand this correctly, but it is a somewhat roundabout way to achieve what you want to do.

This should work as well:

foreach(p; persons)
    p.With!((x){writeln(x.address); return x.address;});

The reason is that there are two different ways for forming function literals. The lambda literal a=>exp is immediately rewritten to (a){ return exp; }

Historically, the lambda syntax has not been available, turning function literal heavy code into something that looked like {return{return(){return((){return}())}. The introduction of '=>' was a backwards-compatible addition.

Reply via email to