foreach without front

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Thu Aug 14 11:16:40 PDT 2014


On 08/14/2014 07:39 PM, Ali Çehreli wrote:
> On 08/11/2014 08:40 AM, Jonathan Marler wrote:
>
>  > I know this is kinda "nit picky" but it would be nice if foreach
>  > supported iterating through input ranges without accessing the front
>  > function.
>  >
>  > foreach(myInputRange) {
>  >      // myInputRange has a front function but it is
>  >      // never called because the foreach has no type list
>  > }
>
> The syntax does not allow that but I have discovered a WAT! :) If you
> implement iteration by opApply() member functions, it is possible to use
> any random name and it works.
>
> The following type provides both an int and a void overload.
> ...

Why would this be surprising?

import std.stdio;
struct S{
     int opApply(int delegate(int) dg){
         foreach(i;0..3)
             if(int b=dg(i))
                 return b;
         return 0;
     }
     int opApply(int delegate() dg){
         foreach(i;0..3)
             if(int b=dg())
                 return b;
         return 0;
     }
}

void main(){
     auto s = S();
     foreach(i; s) writeln(i);
     foreach(WAT; s) writeln("_");
     // the above is rewritten roughly to the following,
     // which is valid code, calling the first opApply overload
     switch(s.opApply((WAT){
         writeln("_"); return 0;
     })){
         default: break;
     }
}

This still works if the second opApply overload is removed. The current 
'foreach' will never call it.




More information about the Digitalmars-d mailing list