Discussion Thread: DIP 1033--Implicit Conversion of Expressions to Delegates--Community Review Round 1
Steven Schveighoffer
schveiguy at gmail.com
Thu Apr 23 16:37:31 UTC 2020
On 4/23/20 7:13 AM, Patrick Schluter wrote:
> On Thursday, 23 April 2020 at 09:33:35 UTC, aliak wrote:
>> On Wednesday, 22 April 2020 at 11:56:44 UTC, kinke wrote:
>>> I don't think this is a good idea. One of the problems with `lazy`
>>> IMO is that one needs good IDE support to somehow highlight that the
>>> argument expression isn't evaluated before the call, and might not be
>>> evaluated at all:
>>>
>>> // in some other module:
>>> void foo(lazy int i) {}
>>>
>>> void main()
>>> {
>>> int i = 1;
>>> foo(++i);
>>> assert(i == 1); // what? not incremented above? ah yeah, lazy and
>>> not evaluated at all by foo
>>> }
>>>
>>> The proposal would extend that problem to regular delegate params
>>> too. So I find the explicit version (`() => ++i`) better to make that
>>> clear. I don't think the 'overhead' of putting an additional `() =>`
>>> in front of the expression justifies introducing the proposed
>>> implicit convertibility.
>>
>> I agree with this. Implicit conversion has always been argued against
>> in D - why is it ok now? And this is not the good kind of implicit
>> conversion where the user explicitly asks for it, but the bad kind
>> where the language decides it should happen and the user doesn't know
>> it can even happen.
>>
>> Thinking about it more now feels like the real rationale for the DIP
>> is "in order to deprecate lazy, we need an alternative" ... ???
>
> I always thought that lazy should also be marked at the call site as it
> is a very different semantic on the caller and on the callee. As it is
> now, it is true that the example above is unfortunate and a real source
> of unpleasant surprizes.
>
>
> void foo(lazy int i) {}
>
> void main()
> {
> int i = 1;
> foo(lazy ++i);
> assert(i == 1); // No surprize here, the required annotation tells
> it.
> }
>
If lazy binds to delegates then this just becomes
foo(() => ++i);
And then we can require lazy to require a delegate at the call site, and
then get rid of lazy.
-Steve
More information about the Digitalmars-d
mailing list