foreach(r; requests) { r.concider(); }
Steven Schveighoffer
schveiguy at yahoo.com
Fri Nov 4 07:34:10 PDT 2011
On Fri, 04 Nov 2011 09:01:11 -0400, Christophe
<travert at phare.normalesup.org> 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
More information about the Digitalmars-d
mailing list