even more delegate sugar

Don Clugston dac at nospam.com.au
Tue Aug 22 04:03:46 PDT 2006


Oskar Linde wrote:
> Don Clugston wrote:
>> Tom S wrote:
>>> While we're at it, how about allowing the construct:
>>> methodName (arg, arg, ..., arg, { ... });
>>>
>>> to be equivalent to:
>>> methodName (arg, arg, ..., arg) { ... }
>>>
>>>
>>> and
>>> methodName ({ ... });
>>>
>>> to
>>> methodName {}
> 
> Just as I and others have suggested already. I really like it.
> 
>>>
>>>
>>> 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).
I don't know if this would be a big problem in practice - but it makes 
me a bit nervous.

What would you do with

methodName (int, void delegate(void) ... )
?

>> 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.



More information about the Digitalmars-d mailing list