On 01/31/2017 03:00 AM, Profile Anaysis wrote:

> Just curious, how can I use start() recursively?
[...]
> Seems I can't create start with a parameter and non-void return type.

Options:

- The class can maintain state

- You can start the fiber with a delegate;

    int local;
    double state;
    () => foo(local, state)

Other than the entry point, there is no requirement in what you can do. The following code yields inside a recursive function:

import std.stdio, std.concurrency, core.thread;

class Search : Fiber
{
    int state;

    this(int state) {
        this.state = state;
        super(&start);
    }
    int res = 0;
    void start() {
        recursive(state);
    }

    void recursive(int s) {
        if (s == 0) {
            return;
        }
        res = s;
        Fiber.yield();
        recursive(s - 1);
    }
}

void main()
{
    auto search = new Search(42);

    foreach (i; 0 .. 5) {
        search.call();
        writeln(search.res);
    }
}

Ali

Reply via email to