On Tuesday, 31 January 2017 at 06:32:02 UTC, Ali Çehreli wrote:
On 01/30/2017 08:12 PM, Profile Anaysis wrote:
import std.stdio, std.concurrency, core.thread;
class Search : Fiber
{
this() { super(&start); }
int res = 0;
void start()
{
Fiber.yield();
res = 1;
}
}
void main()
{
auto search = new Search();
search.call(); writeln(search.res);
search.call(); writeln(search.res);
search.call(); writeln(search.res); // crashes after 3rd
call(first
two work fine)
}
That's because the fiber is not in a callable state. (You can
check with search.state.) Here is one where the fiber function
lives (too) long:
import std.stdio, std.concurrency, core.thread;
class Search : Fiber
{
this() { super(&start); }
int res = 0;
void start() {
while (true) {
Fiber.yield();
++res;
}
}
}
void main()
{
auto search = new Search();
foreach (i; 0 .. 5) {
search.call();
writeln(search.res);
}
}
Ali
Just curious, how can I use start() recursively?
I would like to iterate over a recursive structure and yield for
each "solution". I could use a stack to store the values but the
whole point of the fiber was to avoid that.
void start() {
while (true) {
Fiber.yield();
++res;
}
}
Seems I can't create start with a parameter and non-void return
type. This seems to make it about useless to use a fiber
recursively because no pushing and popping on the stack occur.
class Search : Fiber
{
this() { super(&start); }
bool End = false;
int res = 0;
void start() {
while (!End)
{
int Foo(int x)
{
Fiber.yield();
if (x < 10)
{
res = Foo(x++);
return res;
}
else
return x;
}
}
}
void main()
{
auto search = new Search();
foreach (i; 0 .. 5)
{
search.call();
writeln(search.res);
}
search.End = true;
}
My goal is simple, to yield a solution at each step in the
recursive process.
Maybe I can use another fiber using the lambda syntax?