Prettier iterator implementations in D?

Unknown W. Brackets unknown at simplemachines.org
Thu Oct 19 22:04:10 PDT 2006


Shorter and more beautiful is good, and has merits indeed...

But sometimes clarity comes as a price, and that's not so good.  If I 
were new to D, this:

void opApply( (inout uint) block)

Would look like a funky sort of cast.  That said, this:

void opApply( ) |inout uint|

Is at least clear, if not horrendously ugly to my eyes.

-[Unknown]


> Forgetting about 'foreach' for the moment, I'd like to talk about the 
> other end of things: opApply().
> 
> This code in D:
>     int opApply(int delegate(inout uint) dg)
>     {   int result = 0;
> 
>     for (int i = 0; i < array.length; i++)
>     {
>         result = dg(array[i]);
>         if (result)
>         break;
>     }
>     return result;
>     }
> 
> seems to be rendered in Ruby-ish D as something like:
> 
>     void opApply( ) |inout uint|
>     {
>     for (int i = 0; i < array.length; i++)
>     {
>         yield array[i];
>     }
>     }
> 
> Is there some way to make the real D one look as clean as the Rubified one?
> 
> Main differences:
> 1) need to explicitly declare a delegate,
> 2) need to fiddle with return values.
> 
> For 1) I'm thinking if there were only some more compact way to declare 
> a delegate it would be golden.
> 
> How about this: with function literals, if you leave out the keyword 
> 'delegate' or 'function' you get a delegate.  I.e.
> 
>      int delegate(long c) { return 6 + b; }
> 
> is equivalent to
> 
>      int (long c) { return 6 + b; }
> 
> So it seems logical that as a variable declaration:
> 
>      int delegate(long c) dg;
> 
> could also be made to be equivalent to
> 
>      int (long c) dg;
> 
> In that case we could say in D:
> 
>     void opApply(void (inout uint) dg)
>     {
>     for (int i = 0; i < array.length; i++)
>     {
>         dg(array[i]);
>     }
>     }
> 
> (assuming that pesky 'int return' business can also be sorted out).
> 
> The void can also be omitted frequently in D.  So for a void-returning 
> delegate that could even be shortened to:
> 
>     void opApply( (inout uint) block)
>     {
>     for (int i = 0; i < array.length; i++)
>     {
>         block(array[i]);
>     }
>     }
> 
> Now *that* is something I wouldn't mind staring at at 3am after a long 
> day coding. :-)
> 
> --bb



More information about the Digitalmars-d mailing list