Re: [RFC] Generators

From: Date: Mon, 13 Aug 2012 01:14:46 +0000
Subject: Re: [RFC] Generators
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-62122@lists.php.net to get a copy of this message
On Sun, Aug 12, 2012 at 5:56 PM, Brian Moon <brian@moonspot.net> wrote: > On 8/12/12 5:33 PM, Levi Morrison wrote: >> >> On Sun, Aug 12, 2012 at 2:08 PM, Brian Moon <brian@moonspot.net> wrote: >>> >>> Do you have a good example usage other than a file? I don't find >>> fopen/fgets/fclose all that complicated. What are the other valid use cases >>> for such a thing? >> >> >> One fabulous use case is creating an iterator for a Binary Search >> Tree. A post order done without generators looks like: >> >> >> https://github.com/morrisonlevi/PHP-Datastructures/blob/master/src/Spl/PostOrderIterator.php. >> An iterator using a generator looks something like: >> >> public function getIterator() { >> if ($this->left) yield* $this->left; >> yield $this->value; >> if ($this->right) yield* $this->right; >> } >> >> This is 5 lines. The fully commented version of the post-order >> iterator previously mentioned is 106 lines of code and is considerably >> harder to understand. > > > Well, it's 52 lines, not 106. The 5 lines above are not commented nor are > they spaced at all like the ones in the class. No, Brian, it is 106 lines of actual code I would find in the wild. And sure, I'd have spaced the generator code more like: public function getIterator() { if ($this->left) { yield* $this->left; } if ($this->right) { yield* $this->right; } yield $this->value; } However, that's 11 lines of code compared to 106. > In the above example, what > sets $this->right? or $this->left? Iterators don't set $this->right and $this->left; they only traverse the tree. > I don't consider this a very good example. That's fine. You are entitled to your opinion. However, you didn't have to figure out the 106 lines of code that is the Post-Order iterator. That was a NIGHTMARE and I'm still not 100% confident that it works as it is supposed to. The generator, on the other hand, is simple and follows the definition very closely. MUCH better.

« previous php.internals (#62122) next »