<div dir="ltr">Hey everyone.<div><br></div><div>I've talked to about 100 developers whose primary language is JS this last week (although I admit it was not a balanced survey, mainly people I know). Most of them (Over 80) do not feel that the problem I've mentioned before in scoped method extensions is a real problem they have to solve.</div>

<div><br></div><div>The main argument was that  polyfilling (and as Brendan put it "prollyfilling") was good enough when not writing a library.</div><div> </div><div>I am now convinced that he syntax overhead makes it not worth it in JavaScript. I don't know how "talking to developers" works here or how it is weighted, but I think it gave me a pretty good indication.</div>

<div><br></div><div>Thanks a lot for this discussion, I've learned a lot. Sorry if I wasted someone's time. </div><div><br></div><div>Benjamin Gruenbaum.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

On Wed, Oct 16, 2013 at 1:04 AM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com" target="_blank">brendan@mozilla.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
Benjamin (Inglor) Gruenbaum <mailto:<a href="mailto:inglor@gmail.com" target="_blank">inglor@gmail.com</a>><br></div>
October 15, 2013 2:00 PM<div class="im"><br>
I think I misunderstood `::` before. if `a::b(x_1,...,x_n)` _just_ means `b(a,x_1,...,x_n)`<br>
</div></blockquote>
<br>
No, rather: `b.call(a, x_1, ..., x_n)` but with the original Function.prototype.call (not any shadowing b.call).<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I think it might be a good solution to the chaining problem.<br>
<br>
I think the `.constructor` proposal as well as being able to do `::` completely eliminates the need for extension methods in this regard. It also behaves similarly to extension methods in C# in that it's _just_ a static method and it could also introduce interesting options.<br>


</blockquote>
<br></div>
Indeed static methods with |this| uncurried are easier to call in the absence of ::, and this is why I added these so-called "static generics" to SpiderMonkey:<br>
<br>
js> a = [1,2,3]<br>
[1, 2, 3]<br>
js> Array.map(a, x => x*x)<br>
[1, 4, 9]<br>
js> Array.reduce(a, (r,x) => r*x)<br>
6<br>
js> // etc.<br>
<br>
Doing [].map.call(arraylike, mapfun) or worse, Array.prototype.map.call(<u></u>arraylike, mapfun) is just no fun!<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The only issue here is:<br>
<br>
> Which polymorphism to people want? There is a "DWIM" aspect that cannot possibly cover all uses of, e.g., 'draw' on the right of dot.<br>
<br>
Let's say I have a classic prototypical inheritance use case.<br>
Cat.prototype.meow = function(){...<br>
Kitten.prototype = new Cat()<br>
Kitten.prototype.purr = function(){ ....<br>
<br>
Now I have a catOrKitten object. If I define a `function purr(catOrKitten)` and call `carOrKitten::purr()`<br>
</blockquote>
<br></div>
This is based on your misunderstanding corrected above -- :: binds the object to the left of :: to |this|, not to the first argument.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
regardless of it being a cat or a kitten - that function gets called. If I had an extension method on Cat.prototype, I'd get the ""correct"" behavior for kitten who overrides that method on its prototype.<br>


</blockquote>
<br></div>
I don't see purr on Cat.prototype --what am I missing?<br>
<br>
Anyway, as Russell proposed, :: with imported *methods* (not |this|-free functions) is does call the named function, so without multimethods or any kind of dispatch based on arguments not receiver (this), you're right. You bind a method value to a name and call it on a given |this|.<br>


<br>
Allen objected that this doesn't do receiver-based dispatch, which I think was your point with the cat and kitten. That's true, and SOE has that advantage -- kind of. SOE as I understand the strawman looks in the extension object first, and the extension object has no protototype object. It's flat. If you use an extension name on some other object that is not extended, of course you get polymorphic receiver-based dispatch.<span class="HOEnZb"><font color="#888888"><br>


<br>
/be<br>
</font></span></blockquote></div><br></div>