てか普通にPythonと同じやり方でいいんじゃね?
struct xrange {
 int limit;
 static xrange opCall(int limit) { xrange self; self.limit=limit; return self; }

 int opApply( int delegate(inout int) dg ) {
  for(int i=0; i<limit; ++i)
   if(int r = dg(i))
    return r;
  return 0;
 }
};

void main() {
 foreach(i; xrange(10))
  printf("%d\n", i*i);
}