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