On Fri, 04 Nov 2011 09:01:11 -0400, Christophe <[email protected]> wrote:

"Steven Schveighoffer" , dans le message (digitalmars.D:146563), a
 écrit :

The foreach delegate syntax already allow you to have parametrized
iteration over a structure !

Actually, the delegate do not have to be returned by the & operator, it
can be returned by a function. It's a bit awkward first, but then it's
easy to use:

struct Iterable
{
    int delegate(int delegate(ref int)) inReverse()
    {
        return ()
        {
          int result = 0;
          foreach(int i; 0..100)
          {
             auto t = 99-i;
             if((result = dg(t)) != 0) break;
          }
          return result;
        }
    }

    int delegate(int delegate(ref int)) byStep(int step)
    {
       return()
         {
           int result = 0;
           foreach(int i; iota(0, 100, step))
           {
              auto t = i;
              if((result = dg(t)) != 0) break;
           }
           return result;
         }
    }
}


int main()
{
  Iterable it;
  foreach (i; it.inReverse) writeln(i);
  foreach (i; it.byStep(2)) writeln(i);
}


There is no need to add a special syntax to do what you want !

Maybe there should be a bit more documentation about this.

I'll point out first that this solution allocates a closure on the heap -- not necessarily the most efficient solution.

Second of all, this seems like a *lot* of trouble to go through just to call a function (yes, that's all you're doing). The delegate returned is called *once* and then thrown away.

I'd much rather the language just support the most straightforward solution (calling a function with the given parameters).

-Steve

Reply via email to