Why don't lazy parameters bind to delegates? Was: Feature to get or add value to an associative array.

Jonathan M Davis newsgroup.d at jmdavisprog.com
Fri Apr 20 23:13:58 UTC 2018


On Friday, April 20, 2018 22:46:54 Giles Bathgate via Digitalmars-d wrote:
> On Friday, 20 April 2018 at 22:21:13 UTC, Jonathan M Davis wrote:
> > Honestly, I think that it's a terrible idea to special-case it
> > like that. If we want to argue for making it work in the
> > language, that's fine, but if we special-case it like this,
> > then it will work with some functions that have lazy parameters
> > and not others, and the result will be confusing. Besides, all
> > it takes to be able to pass a lamdba or delegate to a lazy
> > parameter is to actually call it when passing it. So, if you
> > add parens after the braces, it works. There's no need to go
> > and add a special case for it to the function.
>
> Again lack of experience, so I presume you can just do:
>
> bool inserted = false;
> auto p = aa.getOrAdd("key", {inserted = true; return new Person;
> }());
>
> I hadn't realised that until now. I enjoy your brutal honesty by
> the way ;)

Yes. That should work. e.g. this

import std.stdio;

void foo(lazy string l)
{
}

void main()
{
    foo({writeln("foo"); return "str";}());
}

compiles and runs just fine without printing anything, whereas you get a
compilation error if you don't have the parens after the closing brace.

- Jonathan M Davis



More information about the Digitalmars-d mailing list