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