even more delegate sugar

Oskar Linde oskar.lindeREM at OVEgmail.com
Tue Aug 22 04:46:52 PDT 2006


Don Clugston wrote:
> Oskar Linde wrote:
>> Don Clugston wrote:
>>> Tom S wrote:
>>>> Then e.g. the 'dotimes' example from 'Lazy Evaluation of Function 
>>>> Arguments' would become:
>>>>
>>>> void foo() {
>>>>     int x = 0;
>>>>     dotimes(10) {
>>>>         writef(x++);
>>>>     }
>>>> }
>>>>
>>>>
>>>> Which eliminates the need for lazy evaluation in this case, as it 
>>>> simply uses a delegate. Moreover, it is more readable and concise at 
>>>> the same time.
>>>
>>> Sounds nice, but nowhere near enough visual cues.
>>> If you leave off a semicolon, the meaning completely changes.
>>>   dotimes(10); {
>>>    writef(x++);
>>>  }
>>>
>>>   and
>>>
>>>   dotimes(10)
>>>
>>>   {
>>>     writef(x++);
>>>   }
>>>
>>> would both be valid code.
>>
>> Would they? (assuming there is no dotimes overload with only one 
>> argument)
> 
> I was not making that assumption. There's also:
> 
> dotimes(int x, void delegate(void) y = { writefln("Surprise"); });
> 
> (I think that providing a default values for any such trailing delegate 
> would always create this situation).

You are correct, of course.

> I don't know if this would be a big problem in practice - but it makes 
> me a bit nervous.

The fact that C has had this very same issue with if, while, for, et.al. 
for centuries should work in favor of the proposal though.

> What would you do with
> 
> methodName (int, void delegate(void) ... )
> ?

Yes, that is an interesting case. One could either:
a) live with the ; changing the meaning of the code
b) forbid the proposed syntax in the cases where a ; would change the 
   meaning of the code.

> 
>>> But an amazing feature of your proposal is that you could write
>>> a function
>>> void If(bool b, void delegate (void) f);
>>>
>>> and then write
>>>   If( cond) { writef(xxxx); }
>>>
>>> which would behave just like the built-in 'if' statement (albeit 
>>> without an 'else' clause). Interesting.
>>
>> Indeed.
> 
> On reflection, an even more interesting example is variants of foreach, 
> which I think would become completely redundant.

break would pose a problem though.



More information about the Digitalmars-d mailing list