> The syntax is _irrefutably_ unambiguous—otherwise it wouldn't even be in 
the language...

Just to clarify, I meant that it was ambiguous regarding whether or not the 
generator would be "resumed" from a sync or async context (and hence state 
changes may be occurred), not whether or not we had an actual, bonafide 
"yield" expression.

My point is that the suspend/generator example was about as ambiguous with 
regards to asynchronicity as `doSomethingAsync(cb)` is.  The ambiguity is 
purely in the syntax, but for all practical purposes it's abundantly clear.

On Tuesday, August 6, 2013 8:32:11 PM UTC-4, Rick Waldron wrote:
>
>
>
>
> On Tue, Aug 6, 2013 at 8:04 PM, jmar777 <[email protected] <javascript:>>wrote:
>
>> I suppose it's worth pointing out that there's (technically) no ambiguity 
>> about whether or not a yield expression will result in suspension.  It 
>> will. Period.
>>
>> Granted, sometimes execution may be resumed synchronously, and sometimes 
>> from an async context, but I think we're already starting to see some 
>> patterns that give us some indicators there.  Specifically, it's fairly 
>> obvious that the most common approach for async control-flow with 
>> generators is going to be with the assistance of some sort of utility 
>> (e.g., suspend, co, gen-run, galaxy, etc.).
>>
>> That is, consider the following example:
>>
>> suspend(function* () {
>>     var user = yield db.getUser('jmar777');
>> })();
>>
>> So, we now have:
>>
>> 1) function*
>> 2) yield
>> 3) an intentional call to something returning a promise (or continuable)
>> 4) the whole thing is wrapped in a suspend() call, a library who's sole 
>> purpose is to help with async interactions
>>
>> I'll concede on an academic level that the syntax itself is ambiguous 
>> (but hey, that's JavaScript).  However, that's where the ambiguity starts 
>> *and* ends.  The async/suspend/resume semantics are pretty abundantly 
>> clear.
>>
>
> The syntax is _irrefutably_ unambiguous—otherwise it wouldn't even be in 
> the language; yield is not a reserved word and therefore function*() {...} 
> must exist to provide a _single_ new, declarative syntactic form to provide 
> the necessary grammatical context in which the word "yield" may be treated 
> as a language keyword and not just an identifier. It is the very definition 
> of the word "unambiguous".
>
> Everything prior to that: +1
>
> Rick
>
>
>> On Tuesday, August 6, 2013 7:31:04 PM UTC-4, Tim Caswell wrote:
>>>
>>>
>>>
>>>
>>> On Tue, Aug 6, 2013 at 5:20 PM, Mikeal Rogers <[email protected]>wrote:
>>>
>>>> I think Tim means that the author of the generator should assume it 
>>>> will be suspended at any time, not the consumer.
>>>>
>>>
>>> Yes, that's exactly what I mean.  No function that you call can suspend 
>>> you simply by calling it.  That danger does not exist in ES6's version of 
>>> generators.
>>>
>>>  
>>>
>>>>
>>>> On Aug 6, 2013, at 3:17PM, Mark Hahn <[email protected]> wrote:
>>>>
>>>> > Always assume that you will be suspended any time you have a yield 
>>>> or yield* 
>>>>
>>>> How do you know any of this you see a function call?  Only the function 
>>>> definition looks different.  Tell me which is these will yield ..
>>>>
>>>> a()
>>>> b()
>>>> c()
>>>>
>>>> On Tue, Aug 6, 2013 at 2:54 PM, Tim Caswell <[email protected]>wrote:
>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Tue, Aug 6, 2013 at 4:47 PM, Mikeal Rogers <[email protected]>wrote:
>>>>>
>>>>>> It is the *exact same* hazard as the code you posted, I don't think 
>>>>>> it is any *more* of a hazard at the language level. The difference is 
>>>>>> that 
>>>>>> the pattern in the function code below is basically never seen in 
>>>>>> node.js 
>>>>>> code and it has been *possible* to write it since node's creation.
>>>>>>
>>>>>> Could be that nobody will use/clobber closure scope in their 
>>>>>> generators either, but I'm afraid they will because it will work and 
>>>>>> operate as expected *most* of the time and, unlike the function example 
>>>>>> you've posted, it will still fit well when used with what I assume will 
>>>>>> become a healthy ecosystem of generator consuming libraries.
>>>>>>
>>>>>> The reason nobody writes this kind of thing in node is that it just 
>>>>>> won't play well with the rest of the libraries in the ecosystem whereas 
>>>>>> the 
>>>>>> hazardous generator example looks like it would fit just as well as a 
>>>>>> "well 
>>>>>> written" generator until it hits scale and causes visible bugs.
>>>>>>
>>>>>> All kinds of bad patterns and bad code are possible in any language. 
>>>>>> The patterns we adopt to create a healthy ecosystem are what will keep 
>>>>>> people away from the third rails. Depending on people to have "well 
>>>>>> written" code, by some definition of "well", is not a good alternative 
>>>>>> to 
>>>>>> solidifying and encouraging patterns that make it *difficult* to write 
>>>>>> hazardous code in the first place.
>>>>>>
>>>>>> No pattern or feature in JavaScript escapes the potential for abuse 
>>>>>> and bugs, and nothing that I'm worried about w/ respect to generators is 
>>>>>> worse or better than language level hazards w/ callbacks, it's just that 
>>>>>> we've created a set of patterns that *discourage* those hazards in the 
>>>>>> current ecosystem and I'm failing to see how we do that in this 
>>>>>> particular 
>>>>>> case with generators.
>>>>>>
>>>>>
>>>>> I propose a simple rule for all generator code:
>>>>>
>>>>>  - Always assume that you will be suspended any time you have a yield 
>>>>> or yield* and any shared state may change. 
>>>>>
>>>>> If we educate everyone and focus on that one thing (yield) that will 
>>>>> cover all hazards around shared state and generators, be it async 
>>>>> promise/continuable based stuff or sync lazy iterator stuff.
>>>>>
>>>>> Just like with functions we've learned to look for the "function" 
>>>>> keyword and guard our state around that point, we need to do the same 
>>>>> around the "yield" keyword.
>>>>>
>>>>> Teach people correct principles and trust them to do the right thing. 
>>>>>  We'll be fine.
>>>>>
>>>>>  
>>>>>
>>>>>>
>>>>>> -Mikeal
>>>>>>
>>>>>> On Aug 6, 2013, at 2:33PM, Tim Caswell <[email protected]> wrote:
>>>>>>
>>>>>> My question to people on the list is how is this any different than 
>>>>>> the same hazard with normal function?
>>>>>>
>>>>>>     var sum, i;
>>>>>>     function reduce(arr) {
>>>>>>       sum = 0;
>>>>>>       i = 0;
>>>>>>       return function () {
>>>>>>         if (i < arr.length) {
>>>>>>           sum += arr[i++];
>>>>>>           return sum;
>>>>>>         }
>>>>>>       };
>>>>>>     }
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> -- 
>>>>>> Job Board: http://jobs.nodejs.org/
>>>>>> Posting guidelines: https://github.com/joyent/**
>>>>>> node/wiki/Mailing-List-**Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "nodejs" group.
>>>>>> To post to this group, send email to [email protected]
>>>>>>
>>>>>> To unsubscribe from this group, send email to
>>>>>> nodejs+un...@**googlegroups.com
>>>>>>
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>>>  
>>>>>> --- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "nodejs" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to nodejs+un...@**googlegroups.com.
>>>>>>
>>>>>> For more options, visit 
>>>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>>>> .
>>>>>>  
>>>>>>  
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> -- 
>>>>> Job Board: http://jobs.nodejs.org/
>>>>> Posting guidelines: https://github.com/joyent/**
>>>>> node/wiki/Mailing-List-**Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "nodejs" group.
>>>>> To post to this group, send email to [email protected]
>>>>>
>>>>> To unsubscribe from this group, send email to
>>>>> nodejs+un...@**googlegroups.com
>>>>>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>>  
>>>>> --- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "nodejs" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to nodejs+un...@**googlegroups.com.
>>>>>
>>>>> For more options, visit 
>>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>>> .
>>>>>  
>>>>>  
>>>>>
>>>>
>>>>
>>>> -- 
>>>> -- 
>>>> Job Board: http://jobs.nodejs.org/
>>>> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-
>>>> **Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>> You received this message because you are subscribed to the Google
>>>> Groups "nodejs" group.
>>>> To post to this group, send email to [email protected]
>>>>
>>>> To unsubscribe from this group, send email to
>>>> nodejs+un...@**googlegroups.com
>>>>
>>>> For more options, visit this group at
>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>  
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "nodejs" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to nodejs+un...@**googlegroups.com.
>>>>
>>>> For more options, visit 
>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>> .
>>>>  
>>>>  
>>>>
>>>>
>>>>  -- 
>>>> -- 
>>>> Job Board: http://jobs.nodejs.org/
>>>> Posting guidelines: https://github.com/joyent/**node/wiki/Mailing-List-
>>>> **Posting-Guidelines<https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines>
>>>> You received this message because you are subscribed to the Google
>>>> Groups "nodejs" group.
>>>> To post to this group, send email to [email protected]
>>>>
>>>> To unsubscribe from this group, send email to
>>>> nodejs+un...@**googlegroups.com
>>>>
>>>> For more options, visit this group at
>>>> http://groups.google.com/**group/nodejs?hl=en?hl=en<http://groups.google.com/group/nodejs?hl=en?hl=en>
>>>>  
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "nodejs" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to nodejs+un...@**googlegroups.com.
>>>>
>>>> For more options, visit 
>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>> .
>>>>  
>>>>  
>>>>
>>>
>>>  -- 
>> -- 
>> Job Board: http://jobs.nodejs.org/
>> Posting guidelines: 
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> You received this message because you are subscribed to the Google
>> Groups "nodejs" group.
>> To post to this group, send email to [email protected]<javascript:>
>> To unsubscribe from this group, send email to
>> [email protected] <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/nodejs?hl=en?hl=en
>>  
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "nodejs" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>  
>>  
>>
>
>

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to