2015-03-03 12:34 GMT+01:00 Rowan Collins <rowan.coll...@gmail.com>: > > Niklas Keller wrote on 03/03/2015 10:55: >> >> Gr, top-posting... > > > Sorry, was on mobile. ;-) > >> However, since the existence of the word "yield" is the only thing that >> marks a coroutine now, how about using a variant of that for the final >> value, e.g. "yield final $foo"? > > > What's the final value? The last "yield"ed value or a return? > > > "yield final" would mark the final result of the coroutine, as opposed to the intermediate values passed out with a normal "yield". > > > Just to give you some real world example: > If you're using "return", it would look like that: > > public function getSession ($sessionId) { > $result = yield $this->redis->get("session.{$sessionId}")); // We're waiting here until redis responded. > return json_decode($result); > } > > > My suggestion is simply to change the keyword: > > public function getSession ($sessionId) { > $result = yield $this->redis->get("session.{$sessionId}")); // We're waiting here until redis responded. > yield final json_decode($result); > } > > > The reasoning being that when you run getSession(42), it *doesn't* return the result of json_decode(), it returns a pointer to the coroutine's state, which you can resume later. > > Actually, I don't think that example makes sense, because JSON gets sent out at the first yield, and then sent back in, so the caller would look something like this: > > $foo = getSession(42); > $json_data = $foo->current(); > $foo->send($json_data); > $decoded = $foo->getReturn(); > > But never mind, I think we both get the idea. > > I understand the desire for a "final result", but I don't like reusing the word "return", because it's never "returned" as the result of running the function, it's just made available through some specific method/syntax. > > Regards, > -- > Rowan Collins > [IMSoP]
$foo = getSession(42); > $json_data = $foo->current(); > $foo->send($json_data); > $decoded = $foo->getReturn(); Yes, it doesn't make sense if you call it directly, actually, this an example from my chat that uses the amp-framework ( https://github.com/amphp/amp), so this isn't called directly. To me, it isn't obvious that "yield final ..." makes the generator end, but anyone would know if there's a "return". Regards, Niklas