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