generate with state
    Ali Çehreli via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Mon Nov  2 20:29:59 PST 2015
    
    
  
On 11/02/2015 04:51 PM, Freddy wrote:
 > On Tuesday, 3 November 2015 at 00:08:54 UTC, Ali Çehreli wrote:
 >> generate() already allows "callables", which can be a delegate:
 >>
 >> import std.stdio;
 >> import std.range;
 >>
 >> struct S {
 >>     int i;
 >>
 >>     int fun() {
 >>         return i++;
 >>     }
 >> }
 >>
 >> void main() {
 >>     auto s = S(42);
 >>     writefln("%(%s %)", generate(&s.fun).take(5));
 >> }
 >>
 >> Prints
 >>
 >> 42 43 44 45 46
 >
 > Will that allocate gc memory?
Not the way I wrote it. You can test it by putting @nogc to the function 
that uses that code. (The only GC code up there is writefln).
 > Is there any why I pass state as a tuple and have my generator modify 
state
 > as It's called?
Yes but you must ensure that the object will live long enough. A closure 
is simple but it uses GC. The following code passes a temporary object 
and makeMyRange() closes over that variable:
import std.stdio;
import std.range;
struct S {
     int i;
     int fun() {
         return i++;
     }
}
auto makeMyRange(S s) {
     return generate(() => s.fun()).take(5);    // <-- closure
}
void main() {
     writefln("%(%s %)", makeMyRange(S(42)));
}
Alternatively, as long as it will live long enough, you can make a local 
object like 's' in my original code.
Ali
    
    
More information about the Digitalmars-d-learn
mailing list