That's exactly why I pointed it out, apologies for not making that clearer.

On 8 Jul 2010, at 18:17, Jeff Watkins wrote:

> I would think we'd use the ghastly syntax of Java as a cautionary tale rather 
> than something from which to draw inspiration...
> 
> On 7 Jul, 2010, at 11:26 AM, Jürg Lehni wrote:
> 
>> To pick up the lambda discussion again, it is maybe of interest to have an 
>> eye on the recent developments around the introductions of Lambda in Java:
>> 
>> http://www.infoq.com/news/2010/06/lambda-syntax-debate
>> http://stronglytypedblog.blogspot.com/2010/06/so-you-find-java-7-closure-syntax-nasty.html
>> 
>> Jürg
>> 
>> On 29 Apr 2010, at 18:03, Brendan Eich wrote:
>> 
>>> On Apr 29, 2010, at 12:25 AM, Alex Russell wrote:
>>> 
>>>> Some small, pre-colored panels for the shed. Given that these are mostly 
>>>> matters of syntax and not semantics, please believe me when I suggest that 
>>>> the warts discussed herein present sharp edges that should be rounded off 
>>>> by the committee -- not because they're interesting in any way but because 
>>>> the primary users of the language are shipping (bad) fixes around the 
>>>> network billions of times a day. Such rank inefficiency needs sunset date.
>>> 
>>> This is not just about syntax. Let's ignore the threat of being accused of 
>>> bikeshedding and evaluate holistically.
>>> 
>>> 
>>>> Summary of proposals:
>>>> ---------------------
>>>> 
>>>> // 1.) Really generic generics
>>>> 
>>>> ArrSubtype = function() { };
>>>> ArrSubtype.prototype = Object.create(Array.prototype);
>>>> 
>>>> var nas = new ArrSubtype();
>>>> nas.push("howdy", "pardner");
>>>> 
>>>> nas.slice(0) instanceof Array; // currently true
>>>> nas.slice(0) instanceof ArrSubtype; // will be true after fix
>>> 
>>> An incompatible change, but would it break much code? Hard to say without 
>>> trying it at scale. Here are some codesearch results:
>>> 
>>> http://www.google.com/codesearch?hl=en&lr=&q=%22prototype+%3D+[]%3B%22+lang%3Ajavascript&sbtn=Search
>>> http://www.google.com/codesearch?hl=en&lr=&q=%22prototype+%3D+new+Array%3B%22+lang%3Ajavascript&sbtn=Search
>>> 
>>> How would it work exactly? More below on "subtyping".
>>> 
>>>> // 2.) Shorthand for "function", aka the "not lambda"
>>>> 
>>>> node.addEventListener("click", #(e){ e.preventDefault(); });
>>>> node.removeEventListener("click" obj!#(e){ ... }); // see #3
>>> 
>>> The hash or number sign is not obviously all about functions. I've tried 
>>> out the other alternatives in recent talks. No one is really enthusiastic 
>>> about any of
>>> 
>>> λ foo() (bar + baz)
>>> ƒ foo() (bar + baz)
>>> \foo() (bar + baz)
>>> 
>>> (the foo name is optional but should be expressible).
>>> 
>>> The Greek lowercase lambda is actually an incompatible change from ES3 
>>> (perfectly legal identifier there). It's also hard to type on most 
>>> keyboards.
>>> 
>>> The florin is easier (alt-f on my Mac) but maybe a bit visually light and 
>>> hard to scan for quickly, and it's arguably harder for newcomers to divine 
>>> its meaning.
>>> 
>>> The \ does not make much sense, but it was proposed first among all of 
>>> these on es-discuss, IIRC.
>>> 
>>> One wag replied after I had people vote on these "what about voting on 
>>> function"? Many hands then went up, more than for any of the above. This 
>>> set the cat among the shorthand-promoting pigeons.
>>> 
>>> 
>>>> // 3.) Shorthand for Function.prototype.bind
>>>> 
>>>> var boundMethod = obj!method;
>>>> node.addEventListener("click", obj!method);
>>>> node.removeEventListener("click", obj!method);
>>> 
>>> There's some precedent for ! as non-blocking send, returning a promise.
>>> 
>>> 
>>>> NodeList.prototype.parents = function() {
>>>>  // should return a NodeList
>>>>   return this.map(function(n) { return n.parentNode; });
>>>> }
>>> 
>>> IIRC a NodeList is a "live array", sort of a query-as-array or cursor that 
>>> is continuously updated when the DOM mutates. It's really not an Array.
>>> 
>>> 
>>>> * Kill code in libraries that exists only to wrap built-in methods thanks 
>>>> to existing mis-specification of generics
>>>> * Sub-types of Array suffer many warts, but making Array.prototype methods 
>>>> return instances of subtypes will allow DOM-side changes to make subtyping 
>>>> much more natural in real-world systems
>>> 
>>> "Subtype" is not well-defined in JS. Prototype-based delegation is not the 
>>> <: relation from type theory, because of mutation, both of the prototype 
>>> object and of the future binding of f in a scope and f.prototype in 
>>> user-defined function f.
>>> 
>>> This isn't just a pedantic point. If we don't have a well-defined relation, 
>>> how can we evaluate proposals that want to improve support for that 
>>> relation, whatever it is?
>>> 
>>> In this case it seems to me you might want the result of Array generics to 
>>> be created by calling (new this.constructor). For nas.slice(0), the generic 
>>> slice code would then put elements got from |this| into the result of (new 
>>> this.constructor). Is this the spec you want?
>>> 
>>> If so, it seems like an improvement, but again constructor has low 
>>> integrity (none for user-defined constructor functions) without freeze, so 
>>> there's no subtype relation in the formal <: sense. Still, it seems to me 
>>> an improvement, ignoring the incompatibility.
>>> 
>>> 
>>>> // equivalent:
>>>> function(){ return 10; }
>>>> #(){ return 10; }
>>>> #{ return 10; } // no args, optionally elide ()
>>> 
>>> This does several things at once, and we have discussed one of them: 
>>> turning the completion value of the body into the return value.
>>> 
>>> The objection to this, voiced clearly by Waldemar, is the unintended 
>>> completion value in tail position leaking out as a return value. This is 
>>> hard to see and test for, and it requires ugly void operator usage, or a 
>>> dummy final value, to control.
>>> 
>>> Dave Herman has recently proposed 
>>> http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions, which 
>>> include an explicit "completion value here" prefix: => 10; in tail position 
>>> would result in 10, and without => the result would be the undefined value.
>>> 
>>> 
>>>> * equivalent semantics to the function(){} syntax
>>> 
>>> No, not equivalent because tail position completion values are not return 
>>> values with functions. Again semantics matter, not just syntax.
>>> 
>>> 
>>>> 3.) Syntax for bound function de-reference
>>>> [snip] So why does this suck? Two reasons: it's long-ish to type, and it 
>>>> doesn't do what the dot operator does -- i.e., return the same function 
>>>> object every time.
>>> 
>>> The lack of memoization is a good point. I've written at length about the 
>>> challenges for implementations to "join" function objects as an 
>>> optimization:
>>> 
>>> https://mail.mozilla.org/pipermail/es-discuss/2010-February/010830.html
>>> https://mail.mozilla.org/pipermail/es-discuss/2010-February/010832.html
>>> 
>>> 
>>>> What to do? We propose the bang operator -- ! -- as a new form of binding 
>>>> de-reference of function objects. It's one character and even includes a 
>>>> dot.  It has the following additional properties:
>>>> 
>>>> 1.) all de-references via bang from an object/function pair return the 
>>>> *same* function object (modulo #4).
>>>> 4.) bang-bound functions are weakly referenced. If GC would otherwise 
>>>> remove a function object from memory, having previously bang-bound a 
>>>> function should not keep the function object alive
>>> 
>>> This is a tricky area. We have experience with such ephemeral objects. 
>>> Problem is, sometimes users decorate them with ad-hoc properties 
>>> ("expandos"), which by your proposed rules will not keep them alive. The GC 
>>> runs, and the decorator is surprised to see the ad-hoc properties gone.
>>> 
>>> Apart from the ! as promise-send and weak-vs.-expando issues, the big 
>>> objection here is that you make each reference specify bound-ness and 
>>> require memoization on the fly. An alternative would be to bind at method 
>>> definition point. Then you could only extract the bound method, no matter 
>>> how used, and via the conventional . operator. See
>>> 
>>> http://wiki.ecmascript.org/doku.php?id=strawman:obj_initialiser_methods
>>> 
>>> i'm against "invoke-only" methods, but bound method definition syntax is 
>>> easier for users and implementors to swallow, and preserves dot as the one 
>>> operator needed for extraction. It would also make the method reference 
>>> strong, which would avoid the too-weak loss of expando problem.
>>> 
>>> Glad to see this proposed for discussion -- good suggestions, directionally 
>>> and in some details.
>>> 
>>> /be
>>> _______________________________________________
>>> 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