this topic may be discussed before, but i'd bring it up again. closure was introduced in PHP 5.3, function with its context can now be stored in an callable object(or a handler in string type, whatever) i think it's easy and read to introduce generator and yield operator in php
let's see what was in Iterator: 1. every class/interface can be prototyped in php userland, not internal, although many of the them was builtin written in c so make life easier pro: "simple" to implement in ZendEngine, see note 2 aboive con: really ugly to code Iterator/Filter in userland, hard to understand how they worked, code has to be split in rewind/next functions 2. no changes is required in ZendEngine, except powering up "foreach" to support iterator, so ppl can iterate over it much more easier. pro: "simple" to implement in ZendEngine, see note 2 aboive con: - let's see what will yeild/generator looks like: 1. require saving function calling context (not call stack) con(was): there was no way to save it, we had to implement it first con(now): no con, implemented already in 5.3 2. just 1 function, yield at any where in the body pro: much more readable than Iterator con: "yield" is now reserved keyword example: function foo($space_and_new_line = false) { yield "hello"; if ($space_and_new_line) { yield " "; } yield "world"; if ($space_and_new_line) { yield PHP_EOL; } } $g = foo(true); // function foo() is not called here foreach ($g as $i) { // function foo() IS called here echo $i; } function filter($g, $regex) { foreach ($g as $baa) { if (preg_match($regex, $i)) { return true; } // if } // foreach } $g = foo(true); foreach (filter($g, "^\\w+$") as $i) { echo $i; // now letters only } $g = foo(true); echo $g(); // same as: echo $g->value(); $g->next(); this is not in python, neither in php iterator echo $g(); echo $g(); (btw, i think iterator should be able to be used in this way) I don't think you can reimplement it into Iterator in any simpler form, except that you can reuse those classes already implemented. is it perl way? no. because yield/generator make code much more readable, easier to understood, not just "easier" to write, it's the php way ========== for those who don't know what yield/generator is, you can see python document or the following brief (correct me if i'm wrong) . functions (named or unamed/closure) with yield in its body, is a generator function that with context saved, not a normal. it's similar as closure context but with "yield point" saved . when you call a generator function, it returns an generator object . the interface to generator object is exactly like Iterator interface, that can be design to have rewind/next/valid methods, etc . generator is an OuterIterator . you can call $generator->next() (and other methods) explicitly, or call foreach which call iterator/generator methods implictly . the only difference between iterator and generator is how they implement it inside. when php execute "yield", the generator is execution is returned but its execution context is saved, next time the generator is iterated, php execute from the last yield point with all context restored. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php