Communication by mutating shared variables is not a solution.

On 21 Aug 2017 12:47 pm, "Naveen Chawla" <[email protected]> wrote:

> Currently you can set one or more variables outside the scope of the
> generator function during iteration, which the generator function can read.
> Is this so bad?
>
> On Mon, 21 Aug 2017 at 15:24 Marius Gundersen <[email protected]> wrote:
>
>> Generators today can both "send" a value and "receive" a value from their
>> consumer, so they can act as an interactive iterable. See for example
>> [fibonacci with reset](https://developer.mozilla.org/en/docs/Web/
>> JavaScript/Guide/Iterators_and_Generators#Advanced_generators)
>>
>> While generators are "producers" of values, the for-of statement acts as
>> a "consumer" of these values. But unfortunately the for-of cannot send
>> values back to the generator:
>>
>> ```js
>> for(const value of fibonacci()){
>>   console.log(value);
>>   //no way to reset it :(
>> }
>> ```
>>
>> I propose a for-of-with statement, like so:
>>
>> ```js
>> let feedback = false;
>> for(const value of fibonacci() with feedback){
>>   console.log(value)
>>   feedback = value == 8;
>> }
>> ```
>>
>> Note that the variable has to be defined before the for-of-with
>> statement, but the initial value will not be seen inside the generator
>> until [function.sent](https://github.com/allenwb/ESideas/
>> blob/master/Generator%20metaproperty.md) is implemented.
>>
>> The babel output of the for-of-with statement would be the following:
>>
>> ```js
>> var reset = false;
>> var _iteratorNormalCompletion = true;
>> var _didIteratorError = false;
>> var _iteratorError = undefined;
>>
>> try {
>>   for (var _iterator = fibonacci()[Symbol.iterator](), _step;
>> !(_iteratorNormalCompletion = (_step = _iterator.next(reset)).done);
>> _iteratorNormalCompletion = true) {
>>     var value = _step.value;
>>
>>     console.log(value);
>>     reset = value == 8;
>>   }
>> } catch (err) {
>>   _didIteratorError = true;
>>   _iteratorError = err;
>> } finally {
>>   try {
>>     if (!_iteratorNormalCompletion && _iterator.return) {
>>       _iterator.return();
>>     }
>>   } finally {
>>     if (_didIteratorError) {
>>       throw _iteratorError;
>>     }
>>   }
>> }
>> ```
>>
>> Marius Gundersen
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
>
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to