> On 1 Sep 2017, at 20:45, Rowan Collins <rowan.coll...@gmail.com> wrote:
> 
> Is this your own invention, or is the name and semantics based on some 
> existing language or computer science theory? "Fiber" makes me think of 
> strings, rather than coroutines, so maybe I'm missing a key metaphor here.

Fiber is a lightweight thread. Please see 
https://en.wikipedia.org/wiki/Fiber_(computer_science)
And ruby support Fiber. Please see https://ruby-doc.org/core-2.4.1/Fiber.html

> 
>>> <?php
>>> function foo($a)
>>> {
>>>  $b = await $a + 1;
>>>  echo $b;
>>> }
> 
> Should "await" be "yield" here? If not, what happens if I call foo() without 
> being inside a Fiber?

No. A function with a yield will always return a Generator object. A fiber with 
await will return any
value. You can see the await as a resumable return. The value after it will be 
returned and the function
will be paused.

> 
> Similarly, if I run bar() and it runs foo(), what result will I get outside a 
> Fiber, since bar() has no yield, so is not itself a generator?
> 
> 
>> So the Fiber API is a little like the Generator API, but is more simple
>> yet powerful. So there
>> is no need to distinct $generator->current(), $generator->send(), and
>> $generator->getReturn().
> 
> Your ->resume() doesn't seem to do anything a normal generator can't, except 
> that the yield is nested deeper.

The await is a nested deeper yield!

> Nor does it seem to replace getReturn().

<?php
$f = new Fiber(function ($a) {
 return 1;
});

echo $f->resume(); // will output 1

> Meanwhile, how does this relate to other ways of combining generators, such 
> as "yield from"?

You can use Fiber to implement a more simple generator, because fiber can be 
paused/resumed in its deeper
call.

<?php
function bar()
{
  foreach ([5,6] as $i) {
    await $i;
  }
}
function foo()
{
  foreach ([3,4] as $i) {
    await $i;
  }
  bar();
}
$f = new Fiber(function ($a) {
  await 1;
  foo();
});

echo $f->resume(); // will output 1
echo $f->resume(); // will output 2
echo $f->resume(); // will output 3
echo $f->resume(); // will output 4
echo $f->resume(); // will output 5
echo $f->resume(); // will output 6




--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to