On Tue, Oct 4, 2011 at 2:33 PM, Bob Nystrom <[email protected]> wrote:
> > > On Tue, Oct 4, 2011 at 2:12 PM, John J Barton <[email protected] > > wrote: > >> >> >> On Tue, Oct 4, 2011 at 12:59 PM, Bob Nystrom <[email protected]> wrote: >> >>> >>> A constructor is different from a regular function. Instead of returning >>> the value that the body of the function returns, it returns a special >>> newly-created object. >>> >> >> Sorry, already you lost me ;-) I guess you mean the operand of "new"? If >> so, then the different thing is the operator 'new'. It's "new" that makes >> the operand a constructor. >> > > It's the yield that makes a function a generator. One is visible at the > callsite (which means you can *forget* it at the callsite), the other is > visible at the definition. > > >> >> >> >>> Likewise, a generator is a special function that doesn't return what the >>> body returns. >>> >> >> But it does not look special. There is nothing similar to 'new' involved >> in the invocation of the generator. >> > > That's good because it means whether or not a function returns an iterable > object by using yield or through some other means is an implementation > detail of the function and doesn't bleed into every callsite. Let's say > generators *did* have a callsite difference. Now imagine: > > function countdown() { > for (let i = 10; i >= 1; i--) yield i; > } > > let counter = generate countdown(); // <-- in callsite > for (let i of counter) alert(i); > alert('boom!'); > > This magic generate keyword means the function is to be treated like a > generator. But then later it turns out that -- is really slow and you want > to change countdown to: > > function countdown() { > return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]; > } > > Well, you can't. You'd have to fix each callsite too. Your abstraction has > leaked. So I think generators do the right thing here. (And, conversely, I > kind of think constructors do the *wrong* thing.) > We can agree that |new| is a mess even if we don't agree on generators. > > and the state of the generator is hidden from the developer as far as I can >> tell. >> > > That's correct. That's often the cost of concision. By analogy: you can do > a lot of stuff using either an explicit stack data structure or recursion. > Using recursion is often more concise but then the state is hidden from you > in the callstack. Sometimes that's a good trade-off, sometimes it's not. > Thanks, that analogy helps confirm my opinion of generators. In my experience, the good trade-off is recursion on data structures and the not-good-trade-off is recursion for iteration. So far the only examples I've seen for generators involve iteration. > > >> I think generators are an excellent example of a feature that is well >> prototyped (in FF JS 1.7+). I think the developer uptake is minimal, outside >> of the original advocates. I don't hear any clamor for other browsers to >> implement this feature. >> > > Browsers don't clamor, users do. If it was up to the browsers, they > wouldn't implement anything. Implementing is hard work! > I've heard no clamor at all. Really this is a niche feature, an aid for the rare case where conventional iterators are a poor match. jjb > > In languages that do have yield (Python, C#, and Lua are the ones I know) > it's used pretty frequently and without complaint. > > Either way, "class" deserves at least as much investigation. >> > > Agreed! > > - bob > >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

