> On the contrary, It will most likely require a lot of changes to
> provide structures that are able to store their execution context to
> be able to resume it later. I.e.
>
> function foo() {
>    error_reporting(0);
>    yield "foo";
>    trigger_error("foo", E_NOTICE);
>    yield "bar";
> }
> $e = false;
> error_reporting(E_ALL);
> foreach (foo() as $b) {
>     if (!$e) { $e = true; error_reporting(E_ALL); }
> }
>
> 1) will the error be thrown?
> 2) what will the error_reporting value be after the execution of the function 
> ?
>
> error_reporting is a setting that is shared, and here you'd like to
> resume the execution using the old context (error_reporting = 0) to
> continue the function, affecting the outer context, which will stick
> after the function ends? Or do you plan to keep both contexts
> completely separated and create inconsistencies?
>
>> 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
>
> How is that implemented already in 5.3 ?
i haven't dig deep into how closure is implemented, but it's a big
step forward, yield/generator function is another minor step base on
or smilar as closure
>
>>  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) {
foreach ($g as $i) { // <- correction, and sorry, here's the right version
>>    if (preg_match($regex, $i)) {
>>     return true;
yield $i; // <- correction
>>    } // if
>>  } // foreach
>> }
>>
>> $g = foo(true);
>> foreach (filter($g, "^\\w+$") as $i) {
>>  echo $i; // now letters only
>> }
>
> That example looks wrong(and I hope it is):
> - $i is not defined in the scope of filter()
> - filter() returns true or null. You can't iterate on such values.
>
> Also, could you provide an example where this construct is actually useful ?
every Iterator class can be rewritten into more simpler form in
generator function
every generator function can also be rewritten into more
simpler/complexer form in Iterator class (most of the time, it's more
complexer)

for more complex code, i have to write it in pseudo code
function fetch_items()
{
foreach (array(some builtin constant items here) as $item) {
  yield $item;
}
foreach (get_version1_urls() as $v1url) {
  $content = file_get_contents($v1url);
  foreach (parse_version1_content($content) as $item) {
   yield $item;
  }
}
foreach (get_version2_urls() as $v2url) {
  $content = file_get_contents($v2url);
  foreach (parse_version2_content($content) as $item) {
   yield $item;
  }
}
}

yes, as i said you can rewrite it in iterator

iterator class is a stateful iteratable implemented in class, while
generator function is a stateful iteratable implemented in function
(stateful version of function)
if iterator class looks like a state machine that split code into
multiple function/methods, generator function looks like thread base
deisgn that can yield at some point which is sure more easier to write
and understood
you're skilled programmer like i am, understanding/writing iterator
class is no big deal, but generator can make life much better for vast
of php guys
>
> The example you provided doesn't demonstrate anything, as it can be
> implemented in a far easier way using:
>
> function foo($s) {
>    return $s ? array('hello', ' ', 'world', PHP_EOL) : array('hello', 
> 'world');
> }
this is not in iterator class "framework"
>
> foreach(foo() as $word) {
> ...
> }
>
> additionally,  SPL's filterIterator and arrayiterator can be used to
> implement a filtered iteration on the array.
they're already implemented. yes, my example can be rewritten by
reusing already implemented iterator class, but why not think about a
case when ppl have to implemented their own iterator class? or have we
all possible iterator class implemented already?
>
>>
>> $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();
>
> This syntax is definitely not self-explanatory, and will make things
> really hard to understand.
well.. i'm not sure if this is useful either, just a thought when i
bring this topic up :)

>
> I'm skeptic at what value this construct would really add to PHP. And
> my guess is, it will not be worth the trouble implementing it.
thanks for your time

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

Reply via email to