Re: arrow syntax unnecessary and the idea that function is too long

2011-05-22 Thread Claus Reinke
Because the LabelledStatement changes in 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
restrict labels to prefix only LabelUsingStatements. I was 
addressing the backward incompatibility here: ES1-5 allow 
useless labels. You seemed to think that incompatibility was 
important enough to require new label syntax, but I argued 
that it is (a) not important; (b) caught by early error 
during migration.


Ok, so you want to restrict label use. But syntax alone cannot
guarantee that a given label prefix is ever actually used, it can
only rule out alternatives that cannot possibly use the label. 
And introducing such syntactic restrictions on label use means 
that one can no longer insert labels without thinking about

whether they can be used because inserting unused labels
might require rewriting the code. In any case, the result is 
that both parser writers and developers have to think about 
the restrictions that make labeled Statements different from 
Statements. 


I still have a few blind spots where things that I thought
about for this class of language are not actually permitted 
by the Javascript grammar, so perhaps LabelUsingStatement 
won't introduce enough additional complexity to worry 
about. But, generally speaking, I'd prefer to remove

complexity from the grammar, rather than add it.

It isn't that I like labels, but if labels are permitted, I prefer 
them not introducing additional complexity that I have to 
think about. So my comments were based on not having

the LabelledStatement changes, addressing the ambiguity
in another way.

Without changes, any grammar that has ObjectLiteral and
Block as alternatives is ambiguous:

   ObjectLiteral | Block// ambiguous

Assuming we want to resolve ambiguities by preferring
ObjectLiteral, we could write

   ObjectLiteral | (Block butnot ObjectLiteral)

where the right branch is the implicit grammar for what you 
are aiming to spec explicitly, by removing the ambiguous 
cases from Block, specifically from LabelledStatement, to

give us some form of RestrictedBlock that doesn't conflict
with ObjectLiteral. So we can combine both in arrow bodies

   ObjectLiteral | RestrictedBlock

(PEG-style grammars could make that even more implicit,
via ordered choice: anything that is a valid ObjectLiteral 
can no longer reach the second alternative)


The problem I have with that is that I need to think far
ahead to figure out whether I'm writing an ObjectLiteral
or a RestrictedBlock and that I need to be aware of whether 
the Statement I'm writing follows a label or not.


So I'm looking for a way to introduce a committed choice
based on limited lookahead instead. It seems that the
IdentifierName (PropertyName) vs Identifier (label) case
is the one that can lead to long lookaheads, so breaking
that seems a step forward. Hence the new-style labels.

It is not necessary to remove old-style labels right away,
because old code that uses them only uses old language
constructs (which never mix ObjectLiteral and Block). For
code that opts into Harmony, a deprecation warning for
old-style label seems appropriate, but we don't need to
force code rewrites of old code.

For any new language constructs that do mix ObjectLiteral 
and Block, such as arrow syntax, we can arrange that 
'{ Identifier : .. }' always defaults to ObjectLiteral, no matter 
what comes next. In these positions, old-style labels are 
useless, but new language constructs are only used in 
new code, so we  can ask developers to use new label 
syntax if they want  a Block starting with a label in such 
positions.


In grammar terms, the arbitrary lookahead alternative

   ObjectLiteral | (Block butnot ObjectLiteral)

turns into something like

   ObjectLiteral | (Block butnot ('{' (Identifier|StringLiteral) ':' .*)

If this works out, parsers and programmers can commit 
to one of the alternatives after a limited lookahead, no 
matter what comes next. Committed choice also means

no backtracking, so '{ empty: ; }' would be an invalid
ObjectLiteral, not a valid Block, if used as an arrow body
(while '{ :empty: ; }' would be an empty block). 

So there are pros and cons - the means of disambiguation 
are easier to understand, but not as expressive.


Now I don't see any solution in adding new label syntax. 
Having to parse the old one leaves us with the ambiguity. 
What am I missing?


Old labels in old code don't use new features, like arrow
syntax, so the ambiguity does not surface. Old labels in 
new code using arrow syntax will be overlapped by object 
property names, so the ambiguity is resolved. New labels 
in new code using arrow syntax allow to override the

default ambiguity resolution.


but add labels starting with, say ':' (just to pick a prefix).

We really don't want two label syntaxes, ..


Right. The old syntax could be deprecated (when opting in
for ES/next) - it also doesn't allow label parameters or
label variables.


Do you mean prohibited or deprecated? Usually 

Re: arrow syntax unnecessary and the idea that function is too long

2011-05-22 Thread Brendan Eich
On May 22, 2011, at 2:01 AM, Claus Reinke wrote:

 Because the LabelledStatement changes in 
 http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
 restrict labels to prefix only LabelUsingStatements. I was addressing the 
 backward incompatibility here: ES1-5 allow useless labels. You seemed to 
 think that incompatibility was important enough to require new label syntax, 
 but I argued that it is (a) not important; (b) caught by early error during 
 migration.
 
 Ok, so you want to restrict label use. But syntax alone cannot
 guarantee that a given label prefix is ever actually used, it can
 only rule out alternatives that cannot possibly use the label.

The purpose is not to restrict labels to prefix statements that might possibly 
refer to them, for that sake. Misplaced labels are harmless.

The purpose is to parse block and object initialiser in the same context, 
unambiguously.


 Without changes, any grammar that has ObjectLiteral and
 Block as alternatives is ambiguous:
 
   ObjectLiteral | Block// ambiguous

Not for a GLR parser with the proposed label restriction.


 The problem I have with that is that I need to think far
 ahead to figure out whether I'm writing an ObjectLiteral
 or a RestrictedBlock and that I need to be aware of whether the Statement I'm 
 writing follows a label or not.

Not a practical problem. Labels are rare anywhere, even more rare immediately 
after a {, and of course useless if labeling an expression-statement.


 So I'm looking for a way to introduce a committed choice
 based on limited lookahead instead. It seems that the
 IdentifierName (PropertyName) vs Identifier (label) case
 is the one that can lead to long lookaheads, so breaking
 that seems a step forward. Hence the new-style labels.

Please check the rehashing, you said this last time. I understand new style 
labels as a disambiguating change, but we would have to prohibit old-style 
labels, and that's not wanted if we can simply use GLR or better (you mentioned 
PEG).

You seem to acknowledge that a more powerful parser could handle the 
disambiguation, so why change the worry to one about I need to think far ahead 
[when] writing? That is a shift of argument, and the new argument is not 
credible: JS authors do not write labels much, and when they write object 
initialisers, *under the proposal* they aren't writing labels inside, no way, 
no how.

If we go this route of allowing block or object initialiser, then the right 
answer is not to mangle label syntax in Harmony and put some work on JS 
programmers migrating code into Harmony.

The right answer is for spec-writers (the few, the brave, blah blah) to step up 
with GLR or better. Provided there's a sound top-down algorithm that 
implementors can swallow.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Claus Reinke
The top-down approach by default is to parse a cover grammar 
until an unambiguous decision point is reached, then depending 
on the decision, rewrite the AST (e.g., to make a labeled statement 
in a block instead of an object initializer).


A somewhat less intrusive way to disambiguate blocks/objects
might be to separate labels from identifiers - keep the old labels
for backward compatibility,


Why do we need the old useless (unusable, literally) labels for 
backward compatibility?


Yes, stray labels creep into JS. Typically you find javascript: at 
the front of scripts. But finding and fixing these is a one time 
migration step caught by an early error.


I don't understand how these comments relate to my suggestion,
so let me try to clarify what I was suggesting, and why:

- the grammars for block and objects share common prefixes,
   leading to ambiguities that can be resolved by lookahead

- your proposal suggests parsing a cover grammar until
   disambiguation, plus restrictions to LabelledStatement

- both LabelledStatement and PropertyAssignment permit
   IdentifierName followed by ':', followed by something,
   so disambiguation has to be in the something following
   the ':', where overlaps like ExpressionStatement further
   extend the ambiguity

My suggestion was simply to remove IdentifierName from
one of the two, by prefixing labels, thereby moving the
disambiguation point forward. By my estimate, that should
reduce the range of lookahead, the size of cover grammars,
and the need for restricted grammars.

I don't know what that has to do with stray labels, and it
is obviously not possible to remove the old label syntax
immediately. But it would be possible to disambiguate
conflicts between property names and block labels in
favour of property names.


but add labels starting with, say ':' (just to pick a prefix).


We really don't want two label syntaxes, ..


Right. The old syntax could be deprecated (when opting in
for ES/next) - it also doesn't allow label parameters or
label variables.

The block vs. object literal disambiguation part of the 
proposal is at least as solid as the leading formal 
parameter list, which parses as a comma expression 
until you get to the arrow. Indeed TC39 may want the 
label restriction and block vs. object literal part pulled 
out -- we shall see.


I'm not trying to decide whether the proposal's version is 
solid, but it is a non-trivial change, and I've seen non-trivial
suggestions shot down because they were thought to be 
risky. The more options there are for dealing with the 
object literals vs blocks ambiguity, the better the chances 
for it actually happening. Also, special-casing labelled

statements increases the complexity of the grammar.

As a third, extreme option, one could disambiguate by
always preferring the object literal interpretation, and 
ask programmers to start blocks in otherwise ambiguous 
contexts with an empty statement ('{; ..}' cannot be an 
object literal). That would require the fewest changes, 
and perhaps it is all we need, but I'm not sure how 
well it would work in practice, with existing code.


we should focus on the harder nut to crack (the leading 
parenthesized parameter list).


Isn't that an example of issues that would not exist if
arrow functions had a prefix marker?

Claus


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 7:07 AM, Claus Reinke wrote:

 The top-down approach by default is to parse a cover grammar until an 
 unambiguous decision point is reached, then depending on the decision, 
 rewrite the AST (e.g., to make a labeled statement in a block instead of 
 an object initializer).
 A somewhat less intrusive way to disambiguate blocks/objects
 might be to separate labels from identifiers - keep the old labels
 for backward compatibility,
 Why do we need the old useless (unusable, literally) labels for backward 
 compatibility?
 Yes, stray labels creep into JS. Typically you find javascript: at the front 
 of scripts. But finding and fixing these is a one time migration step caught 
 by an early error.
 
 I don't understand how these comments relate to my suggestion,

Because the LabelledStatement changes in 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax restrict 
labels to prefix only LabelUsingStatements. I was addressing the backward 
incompatibility here: ES1-5 allow useless labels. You seemed to think that 
incompatibility was important enough to require new label syntax, but I argued 
that it is (a) not important; (b) caught by early error during migration.


 so let me try to clarify what I was suggesting, and why:
 
 - the grammars for block and objects share common prefixes,
   leading to ambiguities that can be resolved by lookahead

Only by arbitrarily long lookahead, alas.


 - your proposal suggests parsing a cover grammar until
   disambiguation, plus restrictions to LabelledStatement

I'm still working on the proposal. Cover grammar doesn't quite do the trick, in 
the formalism we want. We don't want always to parse a 
MaybeBlockOrObjectLiteral and handle the difference once we see a label on a 
label-using-statement, or else a property name labeling an expression, by 
semantics in the prose. We need a proper grammar for blocks and object literals.


 - both LabelledStatement and PropertyAssignment permit
   IdentifierName followed by ':', followed by something,

(LabelledStatement begins with Identifier, not IdentifierName. That only 
complicates things a bit more ;-), but seems worth pointing out.)


   so disambiguation has to be in the something following
   the ':', where overlaps like ExpressionStatement further
   extend the ambiguity

No, ExpressionStatement cannot be a LabelUsingStatement.

To be concrete, the problem is {L1:{L2:{L3:{L4:{LN: XYZZY  where XYZZY 
is neither of the form Identifier : nor {. Ignoring syntax errors, if XYZZY is 
a reserved identifier, it must begin a LabelUsingStatement (or syntax error, in 
the proposal). Otherwise, it must begin an InitialValue giving LN's property 
value.


 My suggestion was simply to remove IdentifierName from
 one of the two, by prefixing labels, thereby moving the
 disambiguation point forward.

I understood your proposal but perhaps I misunderstood that part of the 
motivation seemed to be stray-label backward compatibility.


 By my estimate, that should
 reduce the range of lookahead, the size of cover grammars,
 and the need for restricted grammars.

Indeed, just not sure anyone is up for an incompatible new label syntax. It may 
be the least evil, though!

Labels are not much used intentionally in JS (for break and continue to label, 
which came in only in ES3).


 I don't know what that has to do with stray labels, and it
 is obviously not possible to remove the old label syntax
 immediately.

Now I don't see any solution in adding new label syntax. Having to parse the 
old one leaves us with the ambiguity. What am I missing?


 But it would be possible to disambiguate
 conflicts between property names and block labels in
 favour of property names.

Being able to disambiguate != having an unambiguous grammar, unfortunately. 
Unless Harmony bans old label syntax, this doesn't help us write a spec-grammar.


 but add labels starting with, say ':' (just to pick a prefix).
 We really don't want two label syntaxes, ..
 
 Right. The old syntax could be deprecated (when opting in
 for ES/next) - it also doesn't allow label parameters or
 label variables.

Do you mean prohibited or deprecated? Usually deprecation means a warning, 
obsolescence or prohibition means removal.


 The block vs. object literal disambiguation part of the proposal is at least 
 as solid as the leading formal parameter list, which parses as a comma 
 expression until you get to the arrow. Indeed TC39 may want the label 
 restriction and block vs. object literal part pulled out -- we shall see.
 
 I'm not trying to decide whether the proposal's version is solid, but it is a 
 non-trivial change, and I've seen non-trivial
 suggestions shot down because they were thought to be risky. The more options 
 there are for dealing with the object literals vs blocks ambiguity, the 
 better the chances for it actually happening. Also, special-casing labelled
 statements increases the complexity of the grammar.

Truly, I'm 

Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 7:43 AM, Brendan Eich wrote:

 That is simpler, but I believe I have seen code like this:
 
   L: { S1; S2; S3; } where S2 is a label-using statement, specifically a 
 break from the outer block, a sugared downward goto that skips S3.
 
 Probably only in tests for labels!
 
 Yes, the strawman proposes to break such code.

Oops, I'm wrong (pre-caffeine here, sorry!) -- the strawman has NonEmptyBlock 
as a LabelUsingStatement, so does not break this at all.


 So requiring {; or similar would be a simpler change and non-breaking in the 
 sense that one can rescue such code so it works in Harmony as it used to, by 
 adding one character. Good idea!

Your idea still may help make a single spec-grammar that does not require some 
arbitrary-lookahead decision procedure on the side.

/be___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 7:07 AM, Claus Reinke wrote:

 we should focus on the harder nut to crack (the leading parenthesized 
 parameter list).
 
 Isn't that an example of issues that would not exist if
 arrow functions had a prefix marker?

It is a deeper issue. ECMA-262 currently covers left-hand side of assignment 
with LeftHandSideExpression, but that produces 42, not a valid LHS. Semantic 
checks and mandatory errors in spec prose make up for the lack of a precise 
grammar.

ES5, Clause 16, has

Attempts to call PutValue on any value for which an early determination can be 
made that the value is not a Reference (for example, executing the assignment 
statement 3=4).

Destructuring assignment -- not the binding forms, e.g. let {x, y} = obj; but 
just assignment expressions, {x, y} = obj -- takes advantage of this cover 
grammar approach, but it will require semantic checks. And as Waldemar points 
out, this constrains RHS structuring via object and array initialisers to 
have the same syntax (unless we add more semantic post-grammar restrictions 
there too!) as the LHS destructuring patterns.

This may be a bad constraint. Type guards don't seem like they'll be only LHS 
or RHS, indeed the :: choice for guard prefix was based on easy composing of 
guards after property names in object initialisers. But some future extension 
might want LHS and RHS to diverge.

Arrow functions really do want a different ArrorFormalParameters sub-grammar 
from ( Expression ) where Expression is of course a comma-expression.

So I'm investigating GLR parsing. It can handle all of these cases without 
ambiguity. It does not require implementatoins to have forking parsers, but it 
is an attractive spec tool. More on this in a bit.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 11:06 AM, Brendan Eich wrote:

 Destructuring assignment -- not the binding forms, e.g. let {x, y} = obj; but 
 just assignment expressions, {x, y} = obj -- takes advantage of this cover 
 grammar approach,

The example {x, y} assumes 
http://wiki.ecmascript.org/doku.php?id=strawman:object_initialiser_shorthand 
makes it to Harmony.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Kam Kasravi
Some references to parsers that do not share ambiguity problems due to limited 
lookahead such as GLR and PEG parsers.

http://www.cs.nyu.edu/rgrimm/papers/pldi06.pdf

http://www.cs.rit.edu/~ats/projects/jsm/paper.xml

http://www.cs.ucla.edu/~awarth/papers/dls07.pdf





From: Brendan Eich bren...@mozilla.com
To: Claus Reinke claus.rei...@talk21.com
Cc: es-discuss es-discuss@mozilla.org
Sent: Friday, May 20, 2011 11:06 AM
Subject: Re: arrow syntax unnecessary and the idea that function is too long


On May 20, 2011, at 7:07 AM, Claus Reinke wrote:


we should focus on the harder nut to crack (the leading parenthesized parameter 
list).

Isn't that an example of issues that would not exist if
arrow functions had a prefix marker?

It is a deeper issue. ECMA-262 currently covers left-hand side of assignment 
with LeftHandSideExpression, but that produces 42, not a valid LHS. Semantic 
checks and mandatory errors in spec prose make up for the lack of a precise 
grammar.

ES5, Clause 16, has

Attempts to call PutValue on any value for which an early determination can be 
made that the value is not a Reference (for example, executing the assignment 
statement 3=4).

Destructuring assignment -- not the binding forms, e.g. let {x, y} = obj; but 
just assignment expressions, {x, y} = obj -- takes advantage of this cover 
grammar approach, but it will require semantic checks. And as Waldemar points 
out, this constrains RHS structuring via object and array initialisers to 
have the same syntax (unless we add more semantic post-grammar restrictions 
there too!) as the LHS destructuring patterns.

This may be a bad constraint. Type guards don't seem like they'll be only LHS 
or RHS, indeed the :: choice for guard prefix was based on easy composing of 
guards after property names in object initialisers. But some future extension 
might want LHS and RHS to diverge.

Arrow functions really do want a different ArrorFormalParameters sub-grammar 
from ( Expression ) where Expression is of course a comma-expression.

So I'm investigating GLR parsing. It can handle all of these cases without 
ambiguity. It does not require implementatoins to have forking parsers, but it 
is an attractive spec tool. More on this in a bit.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 11:26 AM, Kam Kasravi wrote:

 Some references to parsers that do not share ambiguity problems due to 
 limited lookahead such as GLR and PEG parsers.
 
 http://www.cs.nyu.edu/rgrimm/papers/pldi06.pdf
 http://www.cs.rit.edu/~ats/projects/jsm/paper.xml
 http://www.cs.ucla.edu/~awarth/papers/dls07.pdf

The trick is not so much to use an expensive memoizing parser, or even a 
forking one that could be much more efficient, but to figure out how real JS 
parsers, which are all top down in the big VMs, should implement. Working on 
that...

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Claus Reinke

For a presumed-done area, there has been a lot of activity
in parser research recently, partially fueled by IDEs and DSLs
(model-driven development with good generated tool support).

For grammar spec purposes, it might be interesting to look 
at self-applications of these techniques (IDEs for parser 
development, with support for grammar analysis and 
debugging). I keep meaning to look at ANTLRWorks: 


   The ANTLR GUI Development Environment
   http://www.antlr.org/works/index.html

Anyway, the titles for two of those three urls, for those who
don't have time to look right now:


http://www.cs.nyu.edu/rgrimm/papers/pldi06.pdf


   Better Extensibility through Modular Syntax
   Robert Grimm


http://www.cs.rit.edu/~ats/projects/jsm/paper.xml


   Monadic Parsing using JavaScript
   Axel T. Schreiner

Independent of parsing, I recommend that readers of this
thread scroll down to the interpreter (search for 'eval'). It
gives an example of how an essential programming pattern
(monads) is technically supported in Javascript, but mostly
useless due to syntactic overhead: instead of bringing out
the essential aspects, they get burried in syntax (and if one
tries to shunt the 'return's out of the way, ASI says hello).

Javascript coders, when faced with this issue, tend to split
into two groups: one that abandons the variable binding 
functionality of monads and makes due with libraries, and

one that writes preprocessors (the author here, also
streamline.js and Jscex as just two recent examples from 
the nodejs list). 


Just as a further example for those still unconvinced by
the case for better function syntax: it isn't sufficient, but
it is necessary!-)


http://www.cs.ucla.edu/~awarth/papers/dls07.pdf


404 for me?

Claus


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Kam Kasravi
Thanks Claus for the synopsis and pointing out the 404. ometa is the last 
paper: http://www.tinlizzie.org/~awarth/papers/dls07.pdf,
which is a javascript packrat parser. Tom and Mark are very familiar with this 
work I believe.
There are some great examples of javascript monads or monad-like frameworks - 
for example jquery ...

It's unfortunate the harmony grammar cannot take advantage of these more recent 
advances in parsing,
however I understand Brendan's point about accommodating the major implementors.
Any transpiler could certainly go this route.



From: Claus Reinke claus.rei...@talk21.com
To: Kam Kasravi kamkasr...@yahoo.com; Brendan Eich bren...@mozilla.com
Cc: es-discuss es-discuss@mozilla.org
Sent: Friday, May 20, 2011 2:11 PM
Subject: Re: arrow syntax unnecessary and the idea that function is too long

For a presumed-done area, there has been a lot of activity
in parser research recently, partially fueled by IDEs and DSLs
(model-driven development with good generated tool support).

For grammar spec purposes, it might be interesting to look at self-applications 
of these techniques (IDEs for parser development, with support for grammar 
analysis and debugging). I keep meaning to look at ANTLRWorks: 
   The ANTLR GUI Development Environment
   http://www.antlr.org/works/index.html

Anyway, the titles for two of those three urls, for those who
don't have time to look right now:

 http://www.cs.nyu.edu/rgrimm/papers/pldi06.pdf

   Better Extensibility through Modular Syntax
   Robert Grimm

 http://www.cs.rit.edu/~ats/projects/jsm/paper.xml

   Monadic Parsing using JavaScript
   Axel T. Schreiner

Independent of parsing, I recommend that readers of this
thread scroll down to the interpreter (search for 'eval'). It
gives an example of how an essential programming pattern
(monads) is technically supported in Javascript, but mostly
useless due to syntactic overhead: instead of bringing out
the essential aspects, they get burried in syntax (and if one
tries to shunt the 'return's out of the way, ASI says hello).

Javascript coders, when faced with this issue, tend to split
into two groups: one that abandons the variable binding functionality of monads 
and makes due with libraries, and
one that writes preprocessors (the author here, also
streamline.js and Jscex as just two recent examples from the nodejs list). 
Just as a further example for those still unconvinced by
the case for better function syntax: it isn't sufficient, but
it is necessary!-)

 http://www.cs.ucla.edu/~awarth/papers/dls07.pdf

404 for me?

Claus___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-20 Thread Brendan Eich
On May 20, 2011, at 2:11 PM, Claus Reinke wrote:

  Just as a further example for those still unconvinced by
 the case for better function syntax: it isn't sufficient, but
 it is necessary!-)

Good example. Shows how shorter syntax to avoid the 8-letter 'function' is not 
enough, 'return' elimination via expression-language completion value or 
something like it is needed too.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-19 Thread Claus Reinke
Ok, final and most delicate part of the mission here: 
allow (v) - {k: v} and even - {} to return objects, 
not make useless block statements.
.. 
Thanks to Doug for pushing on this idea. I believe that it is 
sound (still to be formalized and tested mechanically) in a 
bottom-up parser.


The top-down approach by default is to parse a cover grammar 
until an unambiguous decision point is reached, then depending 
on the decision, rewrite the AST (e.g., to make a labeled statement 
in a block instead of an object initializer).


A somewhat less intrusive way to disambiguate blocks/objects
might be to separate labels from identifiers - keep the old labels
for backward compatibility, but add labels starting with, say ':'
(just to pick a prefix).

Then, new syntax, such as arrow functions, could default to 
assuming objects when they see '{ identifier: .. }', while 
programmers could write '{ :identifier: .. }' if they want a block 
starting with a label instead. Disambiguation would not have
to look far ahead and there would be less grammar duplication, 
which might translate into reduced potential for things going 
wrong. Empty block values are far from useless, but should be

possible as '-{;}' or '-{:empty:;}'.

I would still prefer combining the infix arrow with a prefix marker,
to avoid ambiguities (for human readers and non-human parsers),
some of which might only arise in combinations with future features.

Claus

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-19 Thread Lasse Reichstein
On Wed, 11 May 2011 02:44:30 +0200, Brendan Eich bren...@mozilla.com  
wrote:


I've mooted \ along with ƒ, etc. for a while. \ is bad for readability  
because it's visually light, but worse, if we want named function  
expression shorthand, then \u10A0(){} is a valid  
Unicode-identifier-char-named function expression.


Is there a plan to make arrow notation allow named function expressions?

/L
--
Lasse Reichstein - reichsteinatw...@gmail.com
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-19 Thread Brendan Eich
On May 19, 2011, at 2:42 AM, Lasse Reichstein wrote:

Hi Lasse.

 On Wed, 11 May 2011 02:44:30 +0200, Brendan Eich bren...@mozilla.com wrote:
 
 I've mooted \ along with ƒ, etc. for a while. \ is bad for readability 
 because it's visually light, but worse, if we want named function expression 
 shorthand, then \u10A0(){} is a valid Unicode-identifier-char-named function 
 expression.
 
 Is there a plan to make arrow notation allow named function expressions?

Not in the strawman. Without a leading special character, that's a bridge too 
far.

Even now the ambiguity with comma expression requires a cover-grammar parsing 
hack, which is used for destructuring assignment and even (going back to ES1) 
left-hand side of assignment. This hack is done for assignments, doable for 
destructuring (SpiderMonkey and Rhino do it), and controversial for arrow 
function formal parameter vs. comma expression parsing.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-19 Thread Brendan Eich
On May 19, 2011, at 1:46 AM, Claus Reinke wrote:

 Ok, final and most delicate part of the mission here: allow (v) - {k: v} 
 and even - {} to return objects, not make useless block statements.
 .. 
 Thanks to Doug for pushing on this idea. I believe that it is sound (still 
 to be formalized and tested mechanically) in a bottom-up parser.
 The top-down approach by default is to parse a cover grammar until an 
 unambiguous decision point is reached, then depending on the decision, 
 rewrite the AST (e.g., to make a labeled statement in a block instead of an 
 object initializer).
 
 A somewhat less intrusive way to disambiguate blocks/objects
 might be to separate labels from identifiers - keep the old labels
 for backward compatibility,

Why do we need the old useless (unusable, literally) labels for backward 
compatibility?

Yes, stray labels creep into JS. Typically you find javascript: at the front of 
scripts. But finding and fixing these is a one time migration step caught by an 
early error.


 but add labels starting with, say ':'
 (just to pick a prefix).

We really don't want two label syntaxes, especially if there is no strong 
compatibility argument for stray labels, and they can be detected as early 
errors in Harmony.

The block vs. object literal disambiguation part of the proposal is at least as 
solid as the leading formal parameter list, which parses as a comma expression 
until you get to the arrow. Indeed TC39 may want the label restriction and 
block vs. object literal part pulled out -- we shall see.

So I say: stray label compatibility is a non-issue and we should focus on the 
harder nut to crack (the leading parenthesized parameter list).

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-17 Thread Brendan Eich
On May 16, 2011, at 7:55 PM, Peter Michaux wrote:

 On Mon, May 9, 2011 at 6:02 PM, Brendan Eich bren...@mozilla.com wrote:
 
 Yes, and we could add call/cc to make (some) compiler writers even happier. 
 But users would shoot off all their toes with this footgun, and some 
 implementors would be hard-pressed to support it. The point is *not * to do 
 any one change that maximizes benefits to some parties while harming others.
 
 By the nature of their task and its complexity, compiler writers
 targeting JavaScript need JavaScript to have features that make it
 possible to generate efficient compiled code. Without the big features
 like call/cc there are many things that just cannot be compiled well
 enough...which ultimately means all the languages that compile to
 JavaScript are just thin sugar layers that really aren't even worth
 the bother. Those languages, like Coffeescript, are obscure and known
 by only a few people.

Rails 3.1 is obscure and known by only a few people?

Seriously, check your attitude. There are many languages in the world. 
Asserting that Python implemented via Skulpt is not worth the bother is 
insulting to people working on that project and using it. If you don't think 
it's worth the bother, feel free not to bother. Your opinion does not become an 
imperative to add arbitrary compiler-target wishlist items.

Here's a list of languages that compile to JS:

https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS

I'm sure it's not complete.


 The goal of pleasing compiler writers should be
 to make it possible to compile existing languages like Perl, Ruby,
 Python and Scheme to JavaScript. These languages are the ones that
 people know and really want to use and target their compilers to
 JavaScript.

This is not a straight-up discussion. You ignore safety, never mind usability. 
Compiler writers want unsafe interfaces to machine-level abstractions. Should 
we expose them? Certainly not, even though not exposing them hurts efforts to 
compile (not transpile, as you note) other languages to JS.

Too bad -- the first order of business is JS as a source language. Being a 
better target for compilers is secondary. It is among the goals, but not 
super-ordinate.

http://wiki.ecmascript.org/doku.php?id=harmony:harmony

Compiler-writers don't seem to be having such a bad time of it, and we can 
proceed on a more concrete requirements proposal basis than taking 
absolute-sounding philosophical stances.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-17 Thread Axel Rauschmayer
On May 17, 2011, at 4:57, Peter Michaux petermich...@gmail.com wrote:

 The goal of pleasing compiler writers should be
 to make it possible to compile existing languages like Perl, Ruby,
 Python and Scheme to JavaScript. These languages are the ones that
 people know and really want to use and target their compilers to
 JavaScript.


You sound like you really hate JavaScript and can’t imagine working with it 
unless some other language is compiled to it.

I’ve programmed quite a bit of Perl, Python, and Scheme and found that once you 
get to know the proverbial “good parts” of JavaScript, it can be quite elegant. 
That is, I don’t miss either of these three languages, except maybe for 
Python’s runtime library (and Java’s tools, but that’s a different topic).

With the increasing momentum behind JavaScript, IMHO the primary goal should be 
to improve the language for people who actually want to program in it. This is 
difficult enough, given all the parties that have to be pleased. Listening to 
feedback from compiler writers should be a secondary goal.

-- 
Dr. Axel Rauschmayer

a...@rauschma.de
twitter.com/rauschma

home: rauschma.de
blog: 2ality.com



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-17 Thread Peter Michaux
On Tue, May 17, 2011 at 10:50 AM, Axel Rauschmayer a...@rauschma.de wrote:
 On May 17, 2011, at 4:57, Peter Michaux petermich...@gmail.com wrote:

 The goal of pleasing compiler writers should be
 to make it possible to compile existing languages like Perl, Ruby,
 Python and Scheme to JavaScript. These languages are the ones that
 people know and really want to use and target their compilers to
 JavaScript.

 You sound like you really hate JavaScript and can’t imagine working with it
 unless some other language is compiled to it.

Actually the opposite is true. I write in JavaScript all day and like
it a lot. I wouldn't want to compile to JavaScript with today's
possibility.

What I was trying to express is that I believe dream of people who
want to compile to JavaScript is to write in their server-side
language of choice (e.g. Perl, Python, Ruby, Scheme, Java, etc) and
compile that to JavaScript.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-17 Thread Brendan Eich
On May 17, 2011, at 5:04 PM, Kyle Simpson wrote:

 Regarding the - and = syntax, I just want to throw out one other concern 
 that I hope is taken into account, not only now, but for the future: I really 
 hope that we don't get to the point where we start adding functionality to 
 that style of function that is not available to explicit functions (we're 
 almost, but not, there with having = do the magical `this` binding).

You have to distinguish syntax from semantics.

There's nothing proposed for arrow functions that is more than shorter syntax 
-- including |this| binding.


 I know Brendan and others have declared it's shorthand only, but it can be 
 a slippery slope, and to rely on the if you don't like - don't use it 
 argument, we have to make sure that it really stays only a shorthand and 
 nothing more, otherwise it's tail-wagging-the-dog.

Agreed, which is why I'm still going to write up a fairy radical Ruby-block 
proposal that competes in this sense: it too gives better function syntax, 
plus semantics not available to arrow functions as constrained to be just 
syntax.

I hope we'll be able to decide between these two approaches quickly, since I do 
not want to do both. That is, either arrow functions win and shorter syntax 
is enough; or we have blocks for control abstraction (which means other syntax 
changes, details soon) and no arrow functions.


 In other words, I hope that those who favor - aren't also hoping that 
 eventually - replaces `function` entirely. As stated many times thus far in 
 this thread, there are still those of us who favor (and maybe always will) 
 the explicitness of `function(){}` or `#(){}`.

There's no way to remove 'function' long syntax from JS. Just no way.

Your point about just syntax is well-taken, since translation tools will be 
important in aiding Harmony migration -- not just for targeting downrev 
browsers but for added static checking -- and these should be as simple (local 
rewriting, e.g. transpilers not compilers) as possible.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-16 Thread Peter Michaux
On Mon, May 9, 2011 at 6:02 PM, Brendan Eich bren...@mozilla.com wrote:

 Yes, and we could add call/cc to make (some) compiler writers even happier. 
 But users would shoot off all their toes with this footgun, and some 
 implementors would be hard-pressed to support it. The point is *not * to do 
 any one change that maximizes benefits to some parties while harming others.

By the nature of their task and its complexity, compiler writers
targeting JavaScript need JavaScript to have features that make it
possible to generate efficient compiled code. Without the big features
like call/cc there are many things that just cannot be compiled well
enough...which ultimately means all the languages that compile to
JavaScript are just thin sugar layers that really aren't even worth
the bother. Those languages, like Coffeescript, are obscure and known
by only a few people. The goal of pleasing compiler writers should be
to make it possible to compile existing languages like Perl, Ruby,
Python and Scheme to JavaScript. These languages are the ones that
people know and really want to use and target their compilers to
JavaScript.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 13, 2011, at 11:25 PM, Brendan Eich wrote:

 I'll update 
 http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax to 
 include an ES5 grammar patch.

Done: http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax, 
specifically 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax#grammar_changes

This requires splitting the sub-grammar starting at Expression (comma 
expression), at AssignmentExpression (which occurs in all comma-separated list 
non-comma-expression contexts, namely argument lists and initialisers), 
creating a parallel production chain from Statement through AssignmentStatement.

Many languages restrict assignment to statement form. We don't need to do that 
and shouldn't break extant code that nests assignment expressions, but 
separating assignment statements (comma-separated lists of assignments) enables 
better right-hand side syntax for arrow function expressions -- namely, they 
don't have to be parenthesized.

Thus you can write

array.map((elem) - elem * elem)
let identity = (x) - x;
thrice = (x) - 3 * x;

without gratuitous parenthesization. Calling an arrow function expression 
requires parentheses on the outside, of course:

alert((- paren me)());

Comments welcome, I haven't had time to formalize and test this but it looks 
like it will work.

/be

Grammar Changes

Change all uses of AssignmentExpression outside of the Expression sub-grammar 
to InitialExpression:

ElementList :// See 11.1.4
Elisionopt InitialExpression
ElementList , Elisionopt InitialExpression
 ...
PropertyAssignment : // See 11.1.5
PropertyName : InitialExpression
 ...
ArgumentList :   // See 11.2
InitialExpression
ArgumentList , InitialExpression
 ...
Initialiser :// See 12.2
= InitialExpression

InitialiserNoIn :// See 12.2
= InitialExpressionNoIn
Define InitialExpression and ArrowFunctionExpression:

InitialExpression :
AssignmentExpression
ArrowFunctionExpression

ArrowFunctionExpression :
FormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
FormalParametersOpt Arrow Block

FormalParameters :
( FormalParameterListOpt )

Arrow : one of - or =

Split assignment out of ExpressionStatement into AssignmentStatement:

Statement :
Block
VariableStatement
EmptyStatement
AssignmentStatement
ExpressionStatement
...

AssignmentStatement :
[lookahead ∉ {{, function}] AssignmentList ;

AssignmentList :
Assignment
AssignmentList , Assignment

Assignment :
LeftHandSideExpression = InitialExpression
LeftHandSideExpression AssignmentOperator InitialExpression

ExpressionStatement :
[lookahead ∉ {{, function}] ConditionalExpression ;
Finally, PrimaryExpression produces a parenthesized ArrowFunctionExpression:

PrimaryExpression :
...
( ArrowFunctionExpression )
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Dmitry A. Soshnikov

On 15.05.2011 10:33, Brendan Eich wrote:

On May 13, 2011, at 11:25 PM, Brendan Eich wrote:

I'll update 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
to include an ES5 grammar patch.


Done: 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax, 
specifically 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax#grammar_changes


This requires splitting the sub-grammar starting at Expression (comma 
expression), at AssignmentExpression (which occurs in all 
comma-separated list non-comma-expression contexts, namely argument 
lists and initialisers), creating a parallel production chain from 
Statement through AssignmentStatement.


Many languages restrict assignment to statement form. We don't need to 
do that and shouldn't break extant code that nests assignment 
expressions, but separating assignment statements (comma-separated 
lists of assignments) enables better right-hand side syntax for arrow 
function expressions -- namely, they don't have to be parenthesized.


Thus you can write

array.map((elem) - elem * elem)
let identity = (x) - x;
thrice = (x) - 3 * x;

without gratuitous parenthesization. Calling an arrow function 
expression requires parentheses on the outside, of course:


alert((- paren me)());

Comments welcome, I haven't had time to formalize and test this but it 
looks like it will work.




Cool!

// Use # to freeze and join to nearest relevant closure
function  return_pure()  {
  return  #(a)  -  a * a;
}
 
let p = return_pure(),

q = return_pure();
assert(p === q);

So, ES3 joined-objects are back. Though, the question is in their 
[[Scope]] difference (i.e. can be they joined in the following case):


let foo = (args...) - {
  return #(a) - args.map(a);
};

foo(1, 2, 3)((x) - x * x); // [1, 4, 9]

foo(5, 10)((x) - x * x); // [25, 10]

Do both have the same (reflected) [[Scope]] to be joined? At first 
glance with named args, e.g. foo(a, b, c) yes, but what's with rest args?


Other things seems fine.

Dmitry.


/be


Grammar Changes

Change all uses of /AssignmentExpression/ outside of the /Expression/ 
sub-grammar to /InitialExpression/:


ElementList :// See 11.1.4
 Elisionopt InitialExpression
 ElementList , Elisionopt InitialExpression
  ...
PropertyAssignment : // See 11.1.5
 PropertyName : InitialExpression
  ...
ArgumentList :   // See 11.2
 InitialExpression
 ArgumentList , InitialExpression
  ...
Initialiser :// See 12.2
 = InitialExpression

InitialiserNoIn :// See 12.2
 = InitialExpressionNoIn

Define /InitialExpression/ and /ArrowFunctionExpression/:

InitialExpression :
 AssignmentExpression
 ArrowFunctionExpression

ArrowFunctionExpression :
 FormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
 FormalParametersOpt Arrow Block

FormalParameters :
 ( FormalParameterListOpt )

Arrow : one of -  or =

Split assignment out of /ExpressionStatement/ into /AssignmentStatement/:

Statement :
 Block
 VariableStatement
 EmptyStatement
 AssignmentStatement
 ExpressionStatement
 ...

AssignmentStatement :
 [lookahead ∉ {{, function}] AssignmentList ;

AssignmentList :
 Assignment
 AssignmentList , Assignment

Assignment :
 LeftHandSideExpression = InitialExpression
 LeftHandSideExpression AssignmentOperator InitialExpression

ExpressionStatement :
 [lookahead ∉ {{, function}] ConditionalExpression ;

Finally, /PrimaryExpression/ produces a parenthesized 
/ArrowFunctionExpression/:


PrimaryExpression :
 ...
 ( ArrowFunctionExpression )


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 8:14 AM, Dmitry A. Soshnikov wrote:
 // Use # to freeze and join to nearest relevant closure
 function return_pure() {
 
   
 return #(a)
  - a * a;
 
 }
 
  
 let p = return_pure
 ()
 ,
 q = return_pure
 ()
 ;
 assert
 (p === q);
 So, ES3 joined-objects are back. Though, the question is in their [[Scope]] 
 difference (i.e. can be they joined in the following case):

The join to nearest relevant closure words were meant to address this. Let's 
see (I made a few typo and syntax fixes):


 let foo = (...args) - {
   return #(a) - args.map(a);
 };
 
 foo(1, 2, 3)((x) - x * x); // [1, 4, 9]
 
 foo(5, 10)((x) - x * x); // [25, 100]
 
 Do both have the same (reflected) [[Scope]] to be joined?

The two foo calls have different unjoinable scope chains enclosing variables 
captured by the returned #(a) - args.map(a) function, specifically args. So 
that hash-frozen arrow-function cannot be joined into one identity.


 At first glance with named args, e.g. foo(a, b, c) yes, but what's with rest 
 args?

Named vs. rest doesn't matter, the question is lexical capture. The name |args| 
is from the outer

(...args) - { return #(a) - args.map(a); }

function. It is used in the inner arrow function.

The location of this |args| parameter is what is actually captured in general. 
This is optimizable to copying the value at that location in many cases, 
including this one, but that doesn't change the fact that the location varies 
with each call to foo.

So args' abstract location differs, and therefore its value may differ, each 
time the inner arrow-function is evaluated. So the # freezes it but it will not 
be joined with other evaluations of the same source form.

However you implement closures, something has to vary each time the inner arrow 
is evaluated, to capture the correct args, [1, 2, 3] or [5, 10].

/be

 
 Other things seems fine.
 
 Dmitry.
 
 /be
 
 Grammar Changes
 
 Change all uses of AssignmentExpression outside of the Expression 
 sub-grammar to InitialExpression:
 
 ElementList :// See 11.1.4
 Elisionopt InitialExpression
 ElementList , Elisionopt InitialExpression
  ...
 PropertyAssignment : // See 11.1.5
 PropertyName : InitialExpression
  ...
 ArgumentList :   // See 11.2
 InitialExpression
 ArgumentList , InitialExpression
  ...
 Initialiser :// See 12.2
 = InitialExpression
 
 InitialiserNoIn :// See 12.2
 = InitialExpressionNoIn
 
 Define InitialExpression and ArrowFunctionExpression:
 
 InitialExpression :
 AssignmentExpression
 ArrowFunctionExpression
 
 ArrowFunctionExpression :
 FormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
 FormalParametersOpt Arrow Block
 
 FormalParameters :
 ( FormalParameterListOpt )
 
 Arrow : one of - or =
 
 
 Split assignment out of ExpressionStatement into AssignmentStatement:
 
 Statement :
 Block
 VariableStatement
 EmptyStatement
 AssignmentStatement
 ExpressionStatement
 ...
 
 AssignmentStatement :
 [lookahead ∉ {{, function}] AssignmentList ;
 
 AssignmentList :
 Assignment
 AssignmentList , Assignment
 
 Assignment :
 LeftHandSideExpression = InitialExpression
 LeftHandSideExpression AssignmentOperator InitialExpression
 
 ExpressionStatement :
 [lookahead ∉ {{, function}] ConditionalExpression ;
 
 Finally, PrimaryExpression produces a parenthesized ArrowFunctionExpression:
 
 PrimaryExpression :
 ...
 ( ArrowFunctionExpression )
 
 
 ___
 es-discuss mailing list
 
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss
 
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 14, 2011, at 11:33 PM, Brendan Eich wrote:

 Grammar Changes
 Change all uses of AssignmentExpression outside of the Expression sub-grammar 
 to InitialExpression:
 
 ...
 ArrowFunctionExpression :
 FormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
 FormalParametersOpt Arrow Block
 
 FormalParameters :
 ( FormalParameterListOpt )

Forgot to include the optional leading |this| parameter, so the above two 
production-sets should be:

ArrowFunctionExpression :
ArrowFormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
ArrowFormalParametersOpt Arrow Block

ArrowFormalParameters :
( FormalParameterListOpt )
( this InitialiserOpt )
( this InitialiserOpt , FormalParameterList )

(Opt at the end is because I can't get dokuwiki to do a subscripted opt as 
ES1-5's grammars do for optional right-hand side terms -- at least not without 
a dokuwiki plugin.)

/be___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
Ok, final and most delicate part of the mission here: allow (v) - {k: v} and 
even - {} to return objects, not make useless block statements.

// Expression bodies needs no parentheses or braces
let identity = (x) - x;
 
// Fix: object initialiser need not be parenthesized, see Grammar Changes
let key_maker = (val) - {key: val};

Thanks to Doug for pushing on this idea. I believe that it is sound (still to 
be formalized and tested mechanically) in a bottom-up parser.

The top-down approach by default is to parse a cover grammar until an 
unambiguous decision point is reached, then depending on the decision, rewrite 
the AST (e.g., to make a labeled statement in a block instead of an object 
initializer).

/be

On May 15, 2011, at 10:26 AM, Brendan Eich wrote:

 On May 14, 2011, at 11:33 PM, Brendan Eich wrote:
 
 Grammar Changes

To enable unparenthesized ObjectLiteral expressions as bodies of arrow 
functions, without ambiguity with Block bodies, restrict LabelledStatement as 
follows:

LabelledStatement :
Identifier : LabelledStatement
Identifier : LabelUsingStatement

LabelUsingStatement :
NonEmptyBlock
IfStatement
IterationStatement
BreakStatement
SwitchStatement
TryStatement

NonEmptyBlock :  // See 12.1
{ StatementList }
The resulting grammar should be unambiguously LR(1) (ignoring ASI), because { 
L: expr...} can parse only as an ObjectLiteral, and { L: { if (cond)... } } or 
similar LabelUsingStatement variations can parse only as a LabelledStatement.

TODO: evaluate top-down parsing difficulty___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Dmitry A. Soshnikov

On 15.05.2011 21:09, Brendan Eich wrote:

On May 15, 2011, at 8:14 AM, Dmitry A. Soshnikov wrote:

// Use # to freeze and join to nearest relevant closure
function return_pure() {


return #(a)
  -  a * a;

}


let p = return_pure
()
,
 q = return_pure
()
;
assert
(p === q);
So, ES3 joined-objects are back. Though, the question is in their [[Scope]] 
difference (i.e. can be they joined in the following case):

The join to nearest relevant closure words were meant to address this. Let's 
see (I made a few typo and syntax fixes):



let foo = (...args) -  {
   return #(a) -  args.map(a);
};

foo(1, 2, 3)((x) -  x * x); // [1, 4, 9]

foo(5, 10)((x) -  x * x); // [25, 100]

Do both have the same (reflected) [[Scope]] to be joined?

The two foo calls have different unjoinable scope chains enclosing variables 
captured by the returned #(a) -  args.map(a) function, specifically args. So 
that hash-frozen arrow-function cannot be joined into one identity.



At first glance with named args, e.g. foo(a, b, c) yes, but what's with rest 
args?

Named vs. rest doesn't matter, the question is lexical capture. The name |args| 
is from the outer

(...args) -  { return #(a) -  args.map(a); }

function. It is used in the inner arrow function.

The location of this |args| parameter is what is actually captured in general.


Oh, my misunderstanding then. Then I just incorrectly treated yours

assert(p === q);

I though here you try to show that the engine will handle the case with 
optimization and reuse (i.e. to join) the function object. However, it 
still not possible because of different scope chain, that exactly why I 
was asking.


So you mean just lexical addressing of free variable? I.e. without 
dynamic scope chain lookup (that what Dave Herman confused recently with 
dynamic scope concept IIRC). However it's interesting -- if ES6 will 
have lexical addressing anyway (that is there will be no dynamic 
bindings -- no `eval`, no `with`, etc, -- just compile-time bindings), 
this means that this optimization will be done in any way, -- without 
needing of this #function in this case. Or am I mistaken again?


Thanks for explanations btw.

Dmitry.


  This is optimizable to copying the value at that location in many cases, 
including this one, but that doesn't change the fact that the location varies 
with each call to foo.

So args' abstract location differs, and therefore its value may differ, each 
time the inner arrow-function is evaluated. So the # freezes it but it will not 
be joined with other evaluations of the same source form.

However you implement closures, something has to vary each time the inner arrow 
is evaluated, to capture the correct args, [1, 2, 3] or [5, 10].



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Dmitry A. Soshnikov
Oh, and just a small note -- perhaps there's a sense to put a comment 
near each line to what result the expression evaluates in your examples, 
e.g.


asset(p === q); // true (or false?)

etc.

Dmitry.

On 15.05.2011 22:55, Dmitry A. Soshnikov wrote:

On 15.05.2011 21:09, Brendan Eich wrote:

On May 15, 2011, at 8:14 AM, Dmitry A. Soshnikov wrote:

// Use # to freeze and join to nearest relevant closure
function return_pure() {


return #(a)
  -  a * a;

}


let p = return_pure
()
,
 q = return_pure
()
;
assert
(p === q);
So, ES3 joined-objects are back. Though, the question is in their 
[[Scope]] difference (i.e. can be they joined in the following case):
The join to nearest relevant closure words were meant to address 
this. Let's see (I made a few typo and syntax fixes):




let foo = (...args) -  {
   return #(a) -  args.map(a);
};

foo(1, 2, 3)((x) -  x * x); // [1, 4, 9]

foo(5, 10)((x) -  x * x); // [25, 100]

Do both have the same (reflected) [[Scope]] to be joined?
The two foo calls have different unjoinable scope chains enclosing 
variables captured by the returned #(a) -  args.map(a) function, 
specifically args. So that hash-frozen arrow-function cannot be 
joined into one identity.



At first glance with named args, e.g. foo(a, b, c) yes, but what's 
with rest args?
Named vs. rest doesn't matter, the question is lexical capture. The 
name |args| is from the outer


(...args) -  { return #(a) -  args.map(a); }

function. It is used in the inner arrow function.

The location of this |args| parameter is what is actually captured in 
general.


Oh, my misunderstanding then. Then I just incorrectly treated yours

assert(p === q);

I though here you try to show that the engine will handle the case 
with optimization and reuse (i.e. to join) the function object. 
However, it still not possible because of different scope chain, that 
exactly why I was asking.


So you mean just lexical addressing of free variable? I.e. without 
dynamic scope chain lookup (that what Dave Herman confused recently 
with dynamic scope concept IIRC). However it's interesting -- if ES6 
will have lexical addressing anyway (that is there will be no dynamic 
bindings -- no `eval`, no `with`, etc, -- just compile-time bindings), 
this means that this optimization will be done in any way, -- without 
needing of this #function in this case. Or am I mistaken again?


Thanks for explanations btw.

Dmitry.

  This is optimizable to copying the value at that location in many 
cases, including this one, but that doesn't change the fact that the 
location varies with each call to foo.


So args' abstract location differs, and therefore its value may 
differ, each time the inner arrow-function is evaluated. So the # 
freezes it but it will not be joined with other evaluations of the 
same source form.


However you implement closures, something has to vary each time the 
inner arrow is evaluated, to capture the correct args, [1, 2, 3] or 
[5, 10].






___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 11:55 AM, Dmitry A. Soshnikov wrote:

 Oh, my misunderstanding then. Then I just incorrectly treated yours
 
 assert(p === q);

This was from 

// Use # to freeze and join to nearest relevant closure
function return_pure() {
  return #(a) - a * a;
}
 
let p = return_pure(),
q = return_pure();
assert(p === q);

and the assertion means what it seems: p is identical to q.


 I though here you try to show that the engine will handle the case with 
 optimization and reuse (i.e. to join) the function object.

I'm not talking about optimization -- this is a case where joining works, since 
the function is pure. It closes over no outer variables' locations.


 However, it still not possible because of different scope chain, that exactly 
 why I was asking.

No, that's not what the strawman says, and not what I said last time. The issue 
is not different scope chains, it is whether there are captured closure 
variables whose abstract locations are not invariant with respect to the source 
function expression in question.

Each evaluation of a given function expression gives a fresh object in JS 
today. WIth joining as Mark proposed at

http://wiki.ecmascript.org/doku.php?id=strawman:const_functions#joining

and with opt-in syntax (the # prefix) as I'm proposing, this fresh function 
object for each evaluation of a function expression rule would no lot apply.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 11:56 AM, Dmitry A. Soshnikov wrote:

 Oh, and just a small note -- perhaps there's a sense to put a comment near 
 each line to what result the expression evaluates in your examples, e.g.
 
 asset(p === q); // true (or false?)

That is confusing and pointless. I meant what I wrote. The assertions are 
intended to claim that their argument conditions are truthy.

See last reply for more on joining. It occurs to me you thought scope chain 
varying in the context of a pure hash-rocket such as #-42 means that function 
cannot be joined, but since it is pure, it need not entrain its scope chain as 
an internal [[Scope]] property.

More, since # freezes, there's no need for it to be duplicated, since there is 
no mutation side channel.

So http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
proposes freezing and joining, only if the user specifies via the # prefix.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Faisal Vali
Could I trouble you to confirm or clarify the semantics of the
following constructs*:

let f = - - 3; // well-formed?

let x = f()();  // x is equal to 3 right?

let global = this;

let o = {};
o.fat  = = this;
o.thin = - this;

assert( o.fat() === global);  // true?
assert( o.thin() === o); // true?

o.thin_then_fat = - = this;
o.fat_then_thin = = - this;


assert(o.thin_then_fat()() === o); // true?
assert(o.fat_then_thin()() === global); // true?

Thanks!

*(based on the arrow syntax proposal
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax)
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Dmitry A. Soshnikov

On 16.05.2011 0:37, Brendan Eich wrote:

On May 15, 2011, at 11:55 AM, Dmitry A. Soshnikov wrote:


Oh, my misunderstanding then. Then I just incorrectly treated yours

assert(p === q);

This was from

// Use # to freeze and join to nearest relevant closure
function return_pure() {
   return #(a) -  a * a;
}

let p = return_pure(),
 q = return_pure();
assert(p === q);

and the assertion means what it seems: p is identical to q.



I though here you try to show that the engine will handle the case with 
optimization and reuse (i.e. to join) the function object.

I'm not talking about optimization -- this is a case where joining works, since 
the function is pure. It closes over no outer variables' locations.



However, it still not possible because of different scope chain, that exactly 
why I was asking.

No, that's not what the strawman says, and not what I said last time. The issue 
is not different scope chains, it is whether there are captured closure 
variables whose abstract locations are not invariant with respect to the source 
function expression in question.

Each evaluation of a given function expression gives a fresh object in JS 
today. WIth joining as Mark proposed at

http://wiki.ecmascript.org/doku.php?id=strawman:const_functions#joining



Got it. Though it still seems to me as just an implementation 
optimization without need to specify explicitly that a function is 
closed (without free variables) and thus can be optimized, i.e. created 
once and stored as some internal property.


Dmitry.


and with opt-in syntax (the # prefix) as I'm proposing, this fresh function object 
for each evaluation of a function expression rule would no lot apply.

/be



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Dmitry A. Soshnikov

On 16.05.2011 0:40, Brendan Eich wrote:

On May 15, 2011, at 11:56 AM, Dmitry A. Soshnikov wrote:


Oh, and just a small note -- perhaps there's a sense to put a comment near each 
line to what result the expression evaluates in your examples, e.g.

asset(p === q); // true (or false?)

That is confusing and pointless. I meant what I wrote. The assertions are 
intended to claim that their argument conditions are truthy.



Yeah, OTOH, yes.


See last reply for more on joining. It occurs to me you thought scope chain 
varying in the context of a pure hash-rocket such as #-42 means that function 
cannot be joined, but since it is pure, it need not entrain its scope chain as an 
internal [[Scope]] property.

More, since # freezes, there's no need for it to be duplicated, since there is 
no mutation side channel.

So http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
proposes freezing and joining, only if the user specifies via the # prefix.



Yep, I got it, thanks, though, as mentioned seems it can be managed then 
at engine level without explicit specifying by the user, no?


Dmitry.

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 1:49 PM, Faisal Vali wrote:

 Could I trouble you to confirm or clarify the semantics of the
 following constructs*:
 
 let f = - - 3; // well-formed?
 let x = f()();  // x is equal to 3 right?

Sure, unambiguous. Same as in CoffeeScript:

coffee f = - - 3;
[Function]
coffee f()()
3


 let global = this;
 
 let o = {};
 o.fat  = = this;
 o.thin = - this;
 
 assert( o.fat() === global);  // true?

Sure, or (no need for global) assert(o.fat() === this).


 assert( o.thin() === o); // true?

Yes.


 o.thin_then_fat = - = this;

This example is given in 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax -- look 
for method:.


 o.fat_then_thin = = - this;
 
 
 assert(o.thin_then_fat()() === o); // true?

Right, as in the strawman.


 assert(o.fat_then_thin()() === global); // true?

No. Since the proposed syntax is just syntax, you can expand it and evaluate:

o.fat_then_thin = (function () { return function () { return this; }; 
}).bind(this);

So the first call,

o.fat_then_thin() indeed returns function () { return this; } from a function 
in which |this| was bound to the outermost |this|, aliased via |global|.

But that (function () { return this; }) result is then immediately invoked and 
the |this| it receives, per ES5 strict and Harmony, is undefined.

That's why I focused on the thin-then-fat example in the strawman. To show 
fat-then-thin with |this| dynamically bound on the second call (to the inner 
thin arrow function), you might need to store the return value of the first 
(outer, o.fat_then_thin()) call as a property value, and call it that way. Or 
via .call/.apply. Or as you did here, but it is less clear to have an undefined 
|this| pop out at the end.

Again, http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax is 
just syntax. Therefore since - does not bind |this|, that parameter is bound 
dynamically depending on the callee sub-expression of the call expression. Same 
as for long function syntax with ES5 strict semantics.

/be___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 1:52 PM, Dmitry A. Soshnikov wrote:

 Each evaluation of a given function expression gives a fresh object in JS 
 today. WIth joining as Mark proposed at
 
 http://wiki.ecmascript.org/doku.php?id=strawman:const_functions#joining
 
 Got it. Though it still seems to me as just an implementation optimization 
 without need to specify explicitly that a function is closed (without free 
 variables) and thus can be optimized, i.e. created once and stored as some 
 internal property.

We would want to specify the optimization in order to make === and egal 
constant time (i.e., based on pointer not value comparison). This matters for 
WeakMaps keyed by joined functions.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-15 Thread Brendan Eich
On May 15, 2011, at 1:54 PM, Dmitry A. Soshnikov wrote:

 See last reply for more on joining. It occurs to me you thought scope chain 
 varying in the context of a pure hash-rocket such as #-42 means that 
 function cannot be joined, but since it is pure, it need not entrain its 
 scope chain as an internal [[Scope]] property.
 
 More, since # freezes, there's no need for it to be duplicated, since there 
 is no mutation side channel.
 
 So http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax 
 proposes freezing and joining, only if the user specifies via the # prefix.
 
 Yep, I got it, thanks, though, as mentioned seems it can be managed then at 
 engine level without explicit specifying by the user, no?

Do you mean that users shouldn't have to write # prefixes to get joining? That 
is hard. SpiderMonkey implements joining for lambdas that do not close over 
outer lexical variables provided those lambdas are used as the initializer of a 
property in an object literal, or as the full RHS of assignment to a property 
of an Object instance. This optimization wins but it requires read and write 
barriers (which we already have for getters and setters in general). It's 
complex.

The # prefix means freeze too, and that is required for joining. ES3 left it to 
implementations to join but that was a mistake that (if implementations had 
done so; none did after early SpiderMonkey bugs were fixed) creates a mutation 
side channel. See also the ES3 global regexp singleton per lexical regular 
expression bug.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-14 Thread Brendan Eich
On May 13, 2011, at 2:52 PM, Brendan Eich wrote:

 One might be tempted to make an unparenthesized (on the outside) function 
 expression with an unparenthesized expression body be a low-precedence 
 expression (say, AssignmentExpression), but then it can't be used as the 
 callee part of a CallExpression without being parenthesized. Such a 
 low-precedence function expression would have to be parenthesized with every 
 operator save comma.

CoffeeScript does something like this. It separates Invocation from Operation 
(both are Expressions, and an Operation combines Expressions using operators, 
sometimes with a narrower non-terminal than Expression on the left of a dyadic 
operator).

Invocations can be chained but the basis case is a Value as callee nonterminal, 
and a Value must be parenthesized if it contains Code. The Code nonterminal 
produces a CoffeeScript function expression, with optional parenthesized 
parameter list, arrow (- or =), and a block body.

The ECMA-262 grammar could be extended like this. It would mean - and = as 
proposed in 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax would not 
be sugar for existing function expression (with .bind or some tamper-proof 
internal equivalent in the case of =). But that seems better than requiring 
parentheses.

This grammar interlude reminds me of the grammar dependency graphs at 
http://blog.nicksieger.com/articles/2006/10/27/visualization-of-rubys-grammar 
-- the Java and JavaScript grammars show the C-family expression 
sub-grammar-dependency tower (duplicated in JS's case due to the NoIn 
productions), with all those precedence levels we know and love. Ruby has a 
flatter graph with a popular primary non-terminal in the middle.

http://www.flickr.com/photos/nicksieger/280661836/sizes/o/in/photostream/ 
(warning: BIG)

I'll update 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax to 
include an ES5 grammar patch.

The Ruby-ish block (Allen's lambda syntax proposal) approach has to be 
considered, still, since it has braces around the outside and avoids all this 
grammar hacking. The downside is an empty block has to be distinguished from 
an empty object initialiser (from an empty block statement :-P). That may not 
be a big downside as Allen noted, although I don't think undefined or null can 
stand in for empty block.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-13 Thread Brendan Eich
On May 7, 2011, at 2:39 PM, Claus Reinke wrote:

 Consider this: w = (x)-y || z
 That code is not obvious at all.  Which of these would it be?
 1: w = function (x) { return y } || z
 2: w = function (x) { return y || z }
 It seems to me that there must be some sort of delineation around the 
 function start and end.  

Either that, or around the function body (expression or statement).


 But such delineation does not have to lead to required syntax
 in the function construct. Such required delineations were not
 part of lambda-calculus originally **, they arose out of implementation 
 limitations that can be overcome.

We're talking JS syntax here, not anything like the original Lambda calculus or 
s-expressions.


 I know that takes some getting used to (been there myself*), but there is an 
 established standard, both in publications on
 programming language theory, and in some real languages: 
   function bodies extend as far as possible **
 
 So your examples would be
 
 1: w = (function (x) return y) || z
 2: w = (function (x) return y || z)

This does not work, because the ECMA-262 grammar simplifies to something like 
this toy bison grammar:

%token FUNCTION
%token NUMBER

%%

Expr: Expr '+' Term
| Term
;

Term: Term '*' Fact
| Fact '(' ')'
| Fact
;

Fact: FUNCTION '(' ')' '{' Expr '}'
| '(' Expr ')'
| NUMBER
;

Notice this grammar parses function expressions with empty parameter lists, and 
function calls with empty argument lists. No statements, only expressions, and 
only numbers with addition and multiplication (and numbers are syntactically 
callable, as in JS), but the essential grammatical structure remains.

Now let's try to extend it to allow an unbraced body for the analogue of ES5's 
PrimaryExpression, here called Fact:

%token FUNCTION
%token NUMBER

%%

Expr: Expr '+' Term
| Term
;

Term: Term '*' Fact
| Fact '(' ')'
| Fact
;

Fact: FUNCTION '(' ')' Fact
| '(' FUNCTION '(' ')' Expr ')'
| '(' Expr ')'
| NUMBER
;

That is, we allow an unparenthesized high-precedence expression (a Fact) as the 
body of a function expression, or else require parentheses around an entire 
function expression whose body is an unparenthesized low-precedence expression 
(an Expr).

The results in reduce/reduce conflicts:

state 23

4 Term: Fact . '(' ')'
5 | Fact .
6 Fact: FUNCTION '(' ')' Fact .

'('  shift, and go to state 13

'+'   reduce using rule 5 (Term)
'+'   [reduce using rule 6 (Fact)]
'*'   reduce using rule 5 (Term)
'*'   [reduce using rule 6 (Fact)]
'('   [reduce using rule 6 (Fact)]
')'   reduce using rule 5 (Term)
')'   [reduce using rule 6 (Fact)]
$default  reduce using rule 5 (Term)

In other words, we've created a hopeless ambiguity between an unparenthesized 
function expression with a high-precedence body expression and a 
parenthesized-on-the-outside function expression with a low-precedence body.

There's a shift/reduce conflict too, but that is not the concern here. The 
problem is that no amount of lookahead can decide by which production to 
reduce. We must give up one of the two function expression forms.

One might be tempted to make an unparenthesized (on the outside) function 
expression with an unparenthesized expression body be a low-precedence 
expression (say, AssignmentExpression), but then it can't be used as the callee 
part of a CallExpression without being parenthesized. Such a low-precedence 
function expression would have to be parenthesized with every operator save 
comma.

In practice, function expressions aren't operated on except by being on the 
right-hand side of assignment, by calling them to make a CallExpression, and by 
concatenating their string conversions, but requiring parens for all 
sub-expression uses of function expressions is a big break from ECMA-262's 
grammar since ES3, which introduced function expressions as PrimaryExpressions 
(highest precedence).

Here is a more complete toy ES sub-grammar, still not too big:

%token FUNCTION
%token IDENT
%token NUMBER
%token PLUSPLUS

%%

Expr: Expr '+' Term
| Term
;

Term: Term '*' Fact
| Fact
;

Fact: PLUSPLUS Fact
| Post
;

Post: Call PLUSPLUS
| Call
;

Call: Call '(' ')'
| Prim
;

Prim: FUNCTION '(' ')' '{' Expr '}'
| '(' Expr ')'
| IDENT
| NUMBER
;

If we make the mistake ES4 made (implemented in SpiderMonkey still) of adding a 
Prim(aryExpression) right-hand side:

Prim: FUNCTION '(' ')' Expr

to allow unbraced expression bodies for function expressions, the 
low-precedence Expr at the end of high-precedence Prim makes a nasty loop in 
the grammar. Waldemar pointed this out a while ago 
(http://www.mail-archive.com/es-discuss@mozilla.org/msg01008.html). His 
counter-example used a let expression, but there's a function expression 
equivalent:

  function () a ? f : x++();

Per the full ES grammar, and 

Re: arrow syntax unnecessary and the idea that function is too long

2011-05-11 Thread Oliver Hunt

On May 11, 2011, at 12:55 AM, Erik Corry wrote:

 2011/5/10 Oliver Hunt oli...@apple.com:
 As much as I'm opposed to the idea of keyword shortening for the sake of 
 keyword shortening, the more i think about it, the less i like the arrow 
 syntax.
 
 I think I'd simply prefer a prefix character to the infix arrow operator, 
 mostly from a readability stand point but i have a few other issues i'll go 
 into later.  When I read the examples in the wiki I simply find it 
 unpleasant and difficult, I can't put my finger on the specific reason 
 either alas :(
 
 I think I'd prefer the #{ expr } or #(args...){ expr } syntaxes simply to 
 ease linear reading of code.  That said they seem to introduce ambiguity 
 with the Records strawman, but on the other hand i'm not too fond of records 
 or even really the tuple strawmen so maybe this isn't necessarily problem.
 
 That said this is kind of bikeshed-y (as B said in twitter)
 
 Honestly these are the big issues I see in JS.current that I'd like to see 
 fixed in JS.next:
  * Array functions (and by proxy list comprehensions) all return Arrays.  I 
 think fixing this is necessary, esp. in the context of iterators existing.
  * for in enumeration with iterators is an icky problem that needs to be 
 resolved.
  * Generalised object subtyping
  * Probably Mark's simple map and set APIs -- these can be implemented in 
 JS, but I suspect much more efficiently by the host vm.  I thought about 
 just doing hashCode() (or whatever) but i'm not sure how v8 would do the 
 hashcodes without obviously increasing memory use.  I presume it's a solved 
 problem (as Java and .NET etc can do it) but a quick Bing (i shall make this 
 a verb!!) for details didn't seem to show much useful info.
 
 We already have getters and setters in the API for an identity hash
 code.  It adds an invisible property to the object (not value).  This
 can cause the object to expand and change 'hidden class' in much the
 same way as would happen if someone just did o.__hashCode__ =
 Math.random().  If the hash code is not visible to the JS code then
 maps could be done in other ways than with a hash code, eg. rehashing
 when objects move.
 
I was actually thinking of object pointers from the PoV of guaranteeing 
uniqueness of hashcode, which of course isn't actually a requirement (facepalm)

 I can see you are thinking of using the address of the object as a
 hash code.  This can work, and early Java VMs did it, but there is a
 nasty gotcha:  You can't leak this hash code to JS code in any way,
 because then you just defeated ASLR and leaked very valuable
 information to any attacker hoping to use buffer overflows to
 overwrite adjacent objects.  You could xor all hash codes with a
 nonce, but it wouldn't be hard for the attacker to find the low bits
 of that nonce.  I'm not sure whether you could recover the high bits
 somehow.

I was aware of those issues, essential plan had been one-way unique hash from 
address which as above is not necessary as you just need to have a fixed 
hashcode for the object :)

 
 Also you put an extra barrier in the way of a moving GC if you do it that way.
I know, which is why i was wondering how V8 did it, given that it obviously 
required the object pointer (see above re: facepalm)

--Oliver

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-11 Thread Brendan Eich
See also

http://wiki.ecmascript.org/doku.php?id=proposals:hashcodes and especially 
http://wiki.ecmascript.org/doku.php?id=proposals:hashcodes#a_note_regarding_security

which date from ES4, and

http://wiki.ecmascript.org/doku.php?id=strawman:encapsulated_hashcodes

which needs updating.

/be

On May 11, 2011, at 1:06 AM, Oliver Hunt wrote:

 
 On May 11, 2011, at 12:55 AM, Erik Corry wrote:
 
 2011/5/10 Oliver Hunt oli...@apple.com:
 As much as I'm opposed to the idea of keyword shortening for the sake of 
 keyword shortening, the more i think about it, the less i like the arrow 
 syntax.
 
 I think I'd simply prefer a prefix character to the infix arrow operator, 
 mostly from a readability stand point but i have a few other issues i'll go 
 into later.  When I read the examples in the wiki I simply find it 
 unpleasant and difficult, I can't put my finger on the specific reason 
 either alas :(
 
 I think I'd prefer the #{ expr } or #(args...){ expr } syntaxes simply to 
 ease linear reading of code.  That said they seem to introduce ambiguity 
 with the Records strawman, but on the other hand i'm not too fond of 
 records or even really the tuple strawmen so maybe this isn't necessarily 
 problem.
 
 That said this is kind of bikeshed-y (as B said in twitter)
 
 Honestly these are the big issues I see in JS.current that I'd like to see 
 fixed in JS.next:
 * Array functions (and by proxy list comprehensions) all return Arrays.  I 
 think fixing this is necessary, esp. in the context of iterators existing.
 * for in enumeration with iterators is an icky problem that needs to be 
 resolved.
 * Generalised object subtyping
 * Probably Mark's simple map and set APIs -- these can be implemented in 
 JS, but I suspect much more efficiently by the host vm.  I thought about 
 just doing hashCode() (or whatever) but i'm not sure how v8 would do the 
 hashcodes without obviously increasing memory use.  I presume it's a solved 
 problem (as Java and .NET etc can do it) but a quick Bing (i shall make 
 this a verb!!) for details didn't seem to show much useful info.
 
 We already have getters and setters in the API for an identity hash
 code.  It adds an invisible property to the object (not value).  This
 can cause the object to expand and change 'hidden class' in much the
 same way as would happen if someone just did o.__hashCode__ =
 Math.random().  If the hash code is not visible to the JS code then
 maps could be done in other ways than with a hash code, eg. rehashing
 when objects move.
 
 I was actually thinking of object pointers from the PoV of guaranteeing 
 uniqueness of hashcode, which of course isn't actually a requirement 
 (facepalm)
 
 I can see you are thinking of using the address of the object as a
 hash code.  This can work, and early Java VMs did it, but there is a
 nasty gotcha:  You can't leak this hash code to JS code in any way,
 because then you just defeated ASLR and leaked very valuable
 information to any attacker hoping to use buffer overflows to
 overwrite adjacent objects.  You could xor all hash codes with a
 nonce, but it wouldn't be hard for the attacker to find the low bits
 of that nonce.  I'm not sure whether you could recover the high bits
 somehow.
 
 I was aware of those issues, essential plan had been one-way unique hash from 
 address which as above is not necessary as you just need to have a fixed 
 hashcode for the object :)
 
 
 Also you put an extra barrier in the way of a moving GC if you do it that 
 way.
 I know, which is why i was wondering how V8 did it, given that it obviously 
 required the object pointer (see above re: facepalm)
 
 --Oliver
 

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-10 Thread Oliver Hunt
As much as I'm opposed to the idea of keyword shortening for the sake of 
keyword shortening, the more i think about it, the less i like the arrow syntax.

I think I'd simply prefer a prefix character to the infix arrow operator, 
mostly from a readability stand point but i have a few other issues i'll go 
into later.  When I read the examples in the wiki I simply find it unpleasant 
and difficult, I can't put my finger on the specific reason either alas :(

I think I'd prefer the #{ expr } or #(args...){ expr } syntaxes simply to ease 
linear reading of code.  That said they seem to introduce ambiguity with the 
Records strawman, but on the other hand i'm not too fond of records or even 
really the tuple strawmen so maybe this isn't necessarily problem.

That said this is kind of bikeshed-y (as B said in twitter)

Honestly these are the big issues I see in JS.current that I'd like to see 
fixed in JS.next:
 * Array functions (and by proxy list comprehensions) all return Arrays.  I 
think fixing this is necessary, esp. in the context of iterators existing.
 * for in enumeration with iterators is an icky problem that needs to be 
resolved.
 * Generalised object subtyping
 * Probably Mark's simple map and set APIs -- these can be implemented in JS, 
but I suspect much more efficiently by the host vm.  I thought about just doing 
hashCode() (or whatever) but i'm not sure how v8 would do the hashcodes without 
obviously increasing memory use.  I presume it's a solved problem (as Java and 
.NET etc can do it) but a quick Bing (i shall make this a verb!!) for details 
didn't seem to show much useful info.

--Oliver

On May 9, 2011, at 6:04 PM, Brendan Eich wrote:

 On May 7, 2011, at 1:37 AM, Jorge wrote:
 
 But if I wanted a shorter syntax, I would no doubt choose ruby blocks' 
 syntax, it's even shorter yet and it's familiar already to millions of 
 programmers.
 
 Ruby and Smalltalk before it had blocks for most of their usable lives. JS 
 does not. Having break, continue, return, this, arguments, and perhaps other 
 features of JS change meaning in a block to refer to aspects of the outer 
 function's activation (if still active) is a big change. It adds new runtime 
 error cases. It's certainly not simpler than shorter function syntax.
 
 Not all JS hackers are Rubyists.
 
 /be
 
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-10 Thread Garrett Smith
On 5/10/11, Oliver Hunt oli...@apple.com wrote:
[...]

 I think I'd prefer the #{ expr } or #(args...){ expr } syntaxes simply to\

What good is Arguments?

[...]
  * Generalised object subtyping
  * Probably Mark's simple map and set APIs -- these can be implemented in\

If it's wish list time, then I'll say triple quotes:

div.innerHTML =

  span id=foo class='bar'#str/span
;
(if not, then I apologize fro being off topic).
-- 
Garrett
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-10 Thread Andrew Dupont
To Oliver's point: I think this would qualify as bikeshedding if this didn't 
really matter. It is a tiny detail, but an important one, so it makes sense 
that we've spent so long discussing it.

I acknowledge the arrow notation's advantages over #:
(a) we've got precious few ASCII characters left and the octothorp has been 
claimed by several strawmen;
(b) the proposed octothorp syntax doesn't solve the -/= thing (having a 
concise syntax for binding functions to current scope);
(c) prior art of CoffeeScript.

I'm not completely sold on it, though, for a couple of reasons:
(a) the cost of typing an arrow on a western keyboard is much higher than the 
cost of an octothorp;
(b) the -/= distinction is, I think, too subtle. Rebinding dramatically 
changes the meaning of the function, so I'd prefer if the notation guaranteed 
that a user couldn't gloss over that by mistaking - for = or vice/versa.

To rephrase that second point: I think it's a good idea to have a shorthand 
syntax for `.bind(this)`, but it has to make itself more obvious than the arrow 
notation proposes. And there's nothing precluding a similar syntax for the 
octothorp (e.g., `#(x){ this.foo }` vs. `##(x){ this.foo }` — retaining 
Brendan's point that the rebinding syntax should be fatter).

(Also, for the purposes of this argument, I'm fine with using another of our 
free ASCII characters in place of the octothorp.)

Cheers,
Andrew



On May 10, 2011, at 5:42 PM, Breton Slivka wrote:

 I have to say that I was a bit indifferent about the different
 syntaxes on offer until I had a good look at the strawman, and found
 that there were differences between - = and #(x)-(x*x); with
 regards to |this| binding. I have to admit that at the moment, exactly
 what those subtleties are, is a little over my head at the moment.
 
 But given I have to explain |this| again
 http://stackoverflow.com/questions/1085674/where-is-my-this-using-objects-method-as-a-callback-function/1085715#1085715
 and again
 http://stackoverflow.com/questions/5639451/why-this-is-not-this/5692094#5692094
 and again...
 
 I appreciate efforts to address the |this| problem. I think though,
 that in terms of familiarity, bind already effectively solves that
 specific issue. The  # operator seems too much like ambient magic to
 me.
 
 Broadly, I like how the arrow syntax resembles mathematical notation
 for functional dependency, much like the original function syntax
 resembles mathematical notation for function. Given some time, I
 don't think it would be hard to get used to. But it might scare some
 programmers easily spooked by weird syntax.  We're the experts, the
 language designers (you), and the advanced users (me and others), who
 are drawn to and appreciate javascript due to its resemblance to
 scheme and haskell etc. etc. so the arrow syntax appeals to us on that
 level. But one of the strengths of Javascript has been as a
 syntactical trojan horse- Getting these nice qualities under the noses
 of people who would otherwise find that stuff unpalatable. For this
 reason, as much as I like arrow syntax, and attempts to address |this|
 scoping, I have to lean towards #(x){x*x}, and us syntactical snobs
 can still have coffeescript.
 
 I still wish there was a way to make |this| less confusing though. I'm
 sure you do too.
 -Breton
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-10 Thread Brendan Eich
On May 10, 2011, at 4:27 PM, Isaac Schlueter wrote:

 On Tue, May 10, 2011 at 16:22, Oliver Hunt oli...@apple.com wrote:
 \ is a much more common lambda symbol in many languages, and i'm not sure 
 what the ambiguity would be in \{...} or \(...){...}.
 
 \(a,b,c) { a + b * c }
 
 That's cute.

Oliver still has a crush on Haskell.

I've mooted \ along with ƒ, etc. for a while. \ is bad for readability because 
it's visually light, but worse, if we want named function expression shorthand, 
then \u10A0(){} is a valid Unicode-identifier-char-named function expression.

Last time we talked about \ in TC39 for shorter function syntax it died hard, 
IIRC.


 I'm also really not happy with the concept of minor variances in syntax 
 having such dramatic impact the language semantics.  All the fiddling with 
 |this| dramatically increases the complexity of the language, it doesn't 
 simplify it.
 
 I completely agree.  It think any short-form function syntax should
 have the exact same semantics as the existing long-form.  We've got
 .bind(obj).  That's enough.

No, there are more efficient ways to implement something with dedicated syntax, 
such as CoffeeScript's =, and it comes up enough that '.bind(this)', ignoring 
optimization difficulty, is too much.

The long-standing way to code lexical this is 'var self = this; ... function 
(...) {... self ... }'. That won't go away, but it is also crying for a 
shorthand.

What makes 'var self = this;' particularly bad is when the inner function is 
named, and all its calls are via that unqualified name.

In such a scenario, ES5 strict's rule of binding |this| to undefined just 
wastes the |this| parameter, and requires 'var self = this' or '.bind(this)' as 
heavyweight workarounds.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Kyle Simpson
Do I understand you that the idea here is 'function' without the 
'function' keyword? I think this has a pretty bad 
backwards-incompatibility with ASI:


x = (x)

{ return x }


Which way should this parse?


My reading of Rick's gist was:

(x = (x)
{return x})

The outer ( ) removes the ASI ambiguity. FWIW, I'm not terribly excited by 
this syntax, but I like it better than -.


One thing that troubles me about the goal/movement to have a shorter 
function syntax... It seems like all the examples we exchange for it are, 
on principle, single-line functions. From a readability standpoint, I think 
it's a little deceptive to judge a syntax like that, without considering how 
it will look for a longer, non-trivial function. How easy will it be to scan 
for a function's start/end if the biggest visual signal for a function start 
(aka, function) is gone and is replaced by that rather non-descript - 
which, as was said earlier in a thread, looks a lot like existing operators.


Since in the real world, functions are usually a lot more than a single 
return statement or a single assignment, I think we should at least keep in 
mind the readability (or lack thereof) of how these proposals look when 
there's 10, 20, 100 lines in a function... By the same token, how easy is 
the readability when there's 2-4 levels of nested functions (the module 
pattern, etc)?



--Kyle

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Irakli Gozalishvili
On Sunday, 2011-05-08 at 20:48 , Peter Michaux wrote:
On Sun, May 8, 2011 at 11:34 AM, Irakli Gozalishvili rfo...@gmail.com wrote:
 
  I'd like to point out that coffeescript has a huge success and in the end
  it's just syntax sugared js.
 
 Can someone give evidence that Coffeescript is actually a success? Has
 anyone crawled the web to determine the rate of Coffeescript adoption?
 (Assuming there is some way to identify Coffeescript's compiled code.)
 Will adoption plateau at a small percentage of total browser scripts?
 
Coffeescript is one of the most watched projects on github. Which I'd say is 
pretty big for such a young project. 
https://github.com/popular/watched 
 People cannot just reiterate this idea that Coffeescript is popular
 and use that as support for arrows without evidence that Coffeescript
 is actually popular.
 

Let's ignore popularity level for the moment, no other proposal has analog of 
`=` which is a solution for a real problem:

var self = this;
function callback() {
 self
} 

 Peter
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss
 
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Kyle Simpson
Let's ignore popularity level for the moment, no other proposal has analog 
of `=` which is a solution for a real problem:


var self = this;
function callback()  {
   self
}


Maybe I missed something, but didn't Brendan's #-function proposal specify 
lexical `this` binding, so that:


function foo() {
  this.bar = baz;
  return #(x){ this.bar = x; };
}

Isn't that the spirit of what = would give us?

--Kyle


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread François REMY
(...)
  Let's ignore popularity level for the moment, no other proposal has analog of 
`=` which is a solution for a real problem:

  var self = this;
  function callback() {
  self
  } 
Sorry, alternatives were evocated. If you had read my last mail (I know it was 
a pretty long one so I don’t blame you), you could have noticed that I proposed 
to use the @-syntax to perform just that. The idea would be that all lambdas 
would have a “bound” this (which would be the biggest distinctive between them 
and functions).
The syntax would be the following :
“@” + ( “(“ + argument-list + “)” )? + ( expression | block )
And it would allow to solve the “this” problem easily :
element.onclick = @this.removeFromParent();
setTimeout((@alert(this)), 10); 

alongside with the other common lambda usage :
firstChilds = elements.map(@a.firstChild);
array.reduce(@(a,b) { return (a-b)*(a+b); });
In case you need to pass a function that has not a bound this, you should 
continue to use the “function” keyword as usual :
var anObjectHasOwnValueOf = Function.prototype.bind.call(function() { 
return this.hasOwnProperty(“valueOf”); 
}, anObject);___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Irakli Gozalishvili

On Monday, 2011-05-09 at 11:02 , Kyle Simpson wrote: 
 Let's ignore popularity level for the moment, no other proposal has analog 
  of `=` which is a solution for a real problem:
  
  var self = this;
  function callback() {
   self
  }
 
 Maybe I missed something, but didn't Brendan's #-function proposal specify 
 lexical `this` binding, so that:
 
 function foo() {
  this.bar = baz;
  return #(x){ this.bar = x; };
 }
 
 Isn't that the spirit of what = would give us?
 
Yes and this case makes following example extremely confusing:

MyObject.prototype.bar = #(x) { this.bar = x }

Is this instance of MyObject ? So we need to use `#` in some places, but in 
other cases we need to stick to long form `function`. I think `-` and `=` is 
way more intuitive and simple. 
 --Kyle
 
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Till Schneidereit
On Mon, May 9, 2011 at 10:40, Kyle Simpson get...@gmail.com wrote:

[snip]

 One thing that troubles me about the goal/movement to have a shorter
 function syntax... It seems like all the examples we exchange for it are,
 on principle, single-line functions. From a readability standpoint, I think
 it's a little deceptive to judge a syntax like that, without considering how
 it will look for a longer, non-trivial function. How easy will it be to scan
 for a function's start/end if the biggest visual signal for a function start
 (aka, function) is gone and is replaced by that rather non-descript -
 which, as was said earlier in a thread, looks a lot like existing operators.

 Since in the real world, functions are usually a lot more than a single
 return statement or a single assignment, I think we should at least keep in
 mind the readability (or lack thereof) of how these proposals look when
 there's 10, 20, 100 lines in a function... By the same token, how easy is
 the readability when there's 2-4 levels of nested functions (the module
 pattern, etc)?

Since several people have asked about and for feedback from the
greater developer community and since I don't think there's a way to
resolve these questions quantitatively, here's my two cents:

The main problem I'm having with declaring lambdas inline is the sheer
verbosity of it. That is, I don't care about _writing_ the code so
much as _reading_ it and stumbling upon it each and every time. You
(Kyle) say that you fear for your code's readability when a shorter
syntax is used for very long functions. I have exactly the opposite
problem: Because of the verbosity required to express even the
(otherwise) most concise statements, I declare my lambdas and then use
their name to increase readability most of the time. While I agree
that there are lots of cases where it's desirable to immediately see
the function start, there's also lots of cases where I'd want the
function itself to be nearly invisible so as to be able to focus on
the contained functionality as much as possible.

Thus, I'd much rather read
var onlyOdds = myArray.map(#(item) {item % 2});
or
var onlyOdds = myArray.map((item) - (item % 2));
than
var onlyOdds = myArray.map(function(item) {return item % 2});

(I'd love
var onlyOdds = myArray.map(item % 0);
but since that's not going to work, I'm willing to settle for the
next-best thing)

To be honest, I don't really care about which exact syntax gets
chosen. I guess if I could freely choose, I'd go for #, but I
understand the desire to save that symbol for other usages. Also, -
communicates intent very nicely in many cases, I think.


 --Kyle


cheers,
till
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Rick Waldron
Dave, Kyle, Andrew et al

Thanks for your feedback, very much appreciated. To clarify, my gist was in
no way meant to be an official proposal of any sort, mostly for my own
personal, academic benefit :)

In that spirit, I've updated the gist based on the comments and I've set a
goal to implement (or at least attempt to implement) my idea using Narcissus
- again, purely for my own benefit, however I will certainly share my
findings for those that might be interested.

Again, thanks for the constructive feedback!

Rick

On Mon, May 9, 2011 at 9:51 AM, Dave Herman dher...@mozilla.com wrote:



 Andrew Dupont mozi...@andrewdupont.net wrote:

 Presumably it could be defined in the grammar so as to prohibit a
 newline in that very place, much like how the return statement is
 defined.

 Yeah, but that's one of the sharper corners of JS as is-- I think it would
 be pretty subtle and error prone. And some people might want to align their
 braces.

 Alternatively: someone in this thread asked whether there was any
 purpose to blocks in ES when they aren't used for try/catch/finally or
 other such purposes. In other words, is there any reason not to
 restrict them to those use cases and thus remove this ambiguity?

 This would be a serious backwards-incompatibility, and with block scoping
 they will become very important. My crystal ball envisions a web full of

if (true) {
...
}

 ;-)

 Dave

 
 Cheers,
 Andrew
 
 
 On May 8, 2011, at 11:20 PM, Dave Herman wrote:
 
  Do I understand you that the idea here is 'function' without the
 'function' keyword? I think this has a pretty bad
 backwards-incompatibility with ASI:
 
  x = (x)
  { return x }
 
  Which way should this parse?
 
  Dave
  --
  Sent from my Android phone with K-9 Mail. Please excuse my brevity.
 
  Rick Waldron waldron.r...@gmail.com wrote:
  Just read
 https://mail.mozilla.org/pipermail/es-discuss/2008-November/008218.html
 and I'm buzzing with the idea of Lisp style functions as inspiration
 for a short hand. While I realize the idea is likely absurd, but I'm
 thinking in terms of concepts that _all_ JavaScript devs know and
 understand.
 
  This is a super simple, first-pass, rough-draft, not-too-serious,
 request-for-comments...
 
  https://gist.github.com/961495
 
  Rick
 
 
 
  On Sun, May 8, 2011 at 1:51 PM, Faisal Vali fais...@gmail.com
 wrote:
  On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com
 wrote:
   On 08/05/2011, at 05:52, Faisal Vali wrote:
  
   (...) I find the
   aesthetics of the arrow-syntax far more consistent with
 javascript's
   C-based-syntactic roots than the preprocessor-tainted '#' (...)
  
   Consistent ?
  
   - in C has a *totally* different meaning !
 
  Yes, but that is why I alluded to a syntactic commonality and not a
  semantic one.
   But, I can see how the disparity in semantics might bother some
 programmers.
  ___
  es-discuss mailing list
  es-discuss@mozilla.org
  https://mail.mozilla.org/listinfo/es-discuss
 
  ___
  es-discuss mailing list
  es-discuss@mozilla.org
  https://mail.mozilla.org/listinfo/es-discuss

 --
 Sent from my Android phone with K-9 Mail. Please excuse my brevity.

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Claus Reinke

  function bodies extend as far as possible **


I see.  So, a function body would be just like an if-block or loop
body.  One full statement, or a block.  There is precedent for that in
the rest of the language.  So, then, this case:

x = function () y; z

would be:

x = function () { return y }; z


Is that a trick question?-) Your interpretation is one plausible
extrapolation of this maximal munch rule to cover javascript's 
function body blocks but it might not be the only one. 


In particular, you have chosen to combine maximal munch for
expressions with minimal munch for statement lists, while one 
might want to apply maximal munch to both expressions and 
statement lists (if the braces around function bodies were to
be made optional). One would need to look at the design options 
in detail before making a decision. 


Javascript's handling of the statement/expression divide could
do with some work, e.g., we want to be able to use functions to 
build control abstractions; but javascript has chosen to make

assignments into expressions, and expressions into statements;
javascript statements/blocks are currently not expressions, and
if we tried to correct that, we'd run into the question of what to
do with assignments (pass them around or execute them).

In the meantime, the only way to abstract over blocks is to
wrap them in functions, so if we wanted to emulate conditional
statements with conditional expressions (or other use cases 
where we want to work with blocks as values), we'd write 
something like this:


(condition ? function() { ..blockA.. } : function() { ..blockB.. })();

The use of function wrappers to delay execution is yet another
motivation for concise (but readable and unambiguous) function 
syntax.


Claus

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
On May 6, 2011, at 11:22 PM, Peter Michaux wrote:

 On Fri, May 6, 2011 at 11:05 PM, Andrew Dupont mozi...@andrewdupont.net 
 wrote:
 
 I don't want to get too deep into matters of taste, but I do think the 
 current syntax is annoyingly verbose for passing lambdas as arguments in 
 other functions. The fact that it's so verbose ends up hurting readability 
 when the function itself is short.
 
 I think that this is what compilers and projects like coffeescript are
 for. In my opinion, JavaScript itself doesn't need this new syntax.

You're free to keep writing eight characters all over the place :-|.

If you don't like reading a shorter function syntax (# has been proposed as 
well as -, and I've combined the two to make #'s meaning compositional with 
respect to object initialisers for records and array initialisers for tuples), 
then shun the offending code by not reading it.


 I think improving JavaScript as a compilation target is a good goal.
 For example, a real lambda with guaranteed proper tail calls, no
 arguments, no need for return,

That's what I'm proposing, ignoring control effects.

By real 'lambda' you must also mean new control effects, with novel runtime 
exceptions, e.g., for return in a lambda attempting to return out of an 
inactive outer function.

We've already decided several times (on this list, even) not to do that kind of 
lambda. IIRC Maciej's post dealt the death blow:

http://www.mail-archive.com/es-discuss@mozilla.org/msg01533.html

But why in the world are you favoring new and definitely more confusing runtime 
semantics along with lambda syntax, while objecting to shorter function syntax 
that avoids ten or 12 of 14 letters?


 etc would make is possible to
 compile Scheme to JavaScript without using something inefficient like
 trampolines. It would also open up recursive programming options in
 plain JavaScript so it would be win-win.

Yes, and we could add call/cc to make (some) compiler writers even happier. But 
users would shoot off all their toes with this footgun, and some implementors 
would be hard-pressed to support it. The point is *not * to do any one change 
that maximizes benefits to some parties while harming others.

Again, I claim you are not harmed by shorthands. Read them or reject them, 
don't use them. JS has many ways to say things, it is already multi-paradigm in 
shallow and deep ways.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
On May 7, 2011, at 1:37 AM, Jorge wrote:

 But if I wanted a shorter syntax, I would no doubt choose ruby blocks' 
 syntax, it's even shorter yet and it's familiar already to millions of 
 programmers.

Ruby and Smalltalk before it had blocks for most of their usable lives. JS does 
not. Having break, continue, return, this, arguments, and perhaps other 
features of JS change meaning in a block to refer to aspects of the outer 
function's activation (if still active) is a big change. It adds new runtime 
error cases. It's certainly not simpler than shorter function syntax.

Not all JS hackers are Rubyists.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
On May 9, 2011, at 2:21 AM, Irakli Gozalishvili wrote:
 On Monday, 2011-05-09 at 11:02 , Kyle Simpson wrote:
 
 Isn't that the spirit of what = would give us?
 
 Yes and this case makes following example extremely confusing:
 
 MyObject.prototype.bar = #(x) { this.bar = x }
 
 Is this instance of MyObject ? So we need to use `#` in some places, but in 
 other cases we need to stick to long form `function`. I think `-` and `=` 
 is way more intuitive and simple.

Exactly. Beyond the CoffeeScript precedent (pave the cowpaths) there is the 
EIBTI Python dictum. We should not add a shorthand for function that materially 
differs in semantics. Alex Russell argued this point with respect to # freezing 
and joining (that is, uniting object identity up to the nearest relevant 
closure). It applies to |this|-binding too.

It is hard to beed = for lexically bound |this| function vs. - for 
dynamically bound |this| function. I've tried. Any form that defaults to 
lexical-|this| and looks like a function from (...){...} on is going to mislead 
programmers, exaclty as you show above.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
You are ignoring =.

Please do read the strawman, such as it is. Edits coming soon to clarify.

/be

On May 7, 2011, at 11:48 PM, Garrett Smith wrote:

 On 5/7/11, Faisal Vali fais...@gmail.com wrote:
 Kyle Simpson get...@gmail.com
 Date: Sat, 7 May 2011 21:58:32 -0500
 Subject: Re: arrow syntax unnecessary and the idea that function is too
 long
 
 snip
 
 With all due respect, Brendan's personal tastes on what kind of code he
 likes to write is not enough.
 It has to be something that is likely to find wide spread support among
 the JavaScript masses.
 
 
 Since the arrow syntax assailants have been quite vocal on this list,
 Yeah, not much vocal  whatevers, right?
 
 I haven't seen much into the benefit of -. I haven't given it a whole
 lot of thought and don't find it all that thrilling, really. Unusually
 underopinionated for me, I know. Though If I was forced to pick
 between - and #, I'd pick #.
 -- 
 Garrett
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
Read the whole thread. As I noted earlier today, Maciej pointed out the 
infelicity of a new control effect system (return, break and continue in lambda 
affecting the outer function, and throwing if the outer function has returned 
already). Waldemar observed that it is hard to beat function, except for the 
syntactic burden. You end up introducing something too like function to be 
worth it, or too strange and confusingly different in JS's 
statements-for-control-effects non-functionally-pure world.

/be

On May 8, 2011, at 2:39 AM, Jorge wrote:

 On 08/05/2011, at 04:58, Kyle Simpson wrote:
 
 (...) So I felt like it was important to voice early that not everyone 
 feels universally so lovey-dovey over that syntax. (..)
 
 What happened to Allen's lambda syntax proposal ?
 When, why was it ditched in favor of - ?
 
 Brendan, you liked it. What has happened ?
 
 https://mail.mozilla.org/pipermail/es-discuss/2008-November/008216.html
 -- 
 Jorge.
 
 Begin forwarded message:
 
 From: Brendan Eich bren...@mozilla.com
 Date: 30 de noviembre de 2008 07:30:14 GMT+01:00
 To: es-discuss@mozilla.org
 Subject: Allen's lambda syntax proposal
 
 At the TC39 meeting two weeks ago in Kona, we had a brief bikeshedding 
 discussion about lambda syntax and why it matters. Observation: blocks in 
 Smalltalk being lightweight means users don't mind writing them for control 
 abstractions, compared to JS functions in ES3. In Smalltalk, ignoring JS, 
 it's hard to beat [ and ] as overhead, although one must count the message 
 selector and its punctuation too.
 
 Allen Wirfs-Brock put his proposal, which will not shock you who know 
 Smalltalk or Allen, on the whiteboard:
 
 // Instead of lambda (a, b, c) { ... }, why not:
 { |a, b, c| ... } ?
 
 I then started to write an example of return to label, and in need of a 
 nested lambda, got stuck for a split second trying to write 
 function^H^H^H^H^H^H^H^lambda. After thinking 0.3 more seconds I then said 
 I will use Allen's proposed syntax. Pure win, readers and the writer (me) 
 agreed.
 
 I think someone proposed pretty much the same syntax here on es*-discuss 
 within the last two years, but I can't find that message at the moment.
 
 Bikeshed color is secondary to semantics, but lambda conciseness does 
 matter. I think Allen's homage to Smalltalk in JS wins. Every time I reach 
 for more verbose syntax my hand steers back to those || delimiters.
 
 Am I an old Smalltalk fan? Sure, I have Byte magazine with the balloons on 
 the cover still (in a box somewhere; mildewed, sadly). I'm the C hacker who 
 took the make it look like Java orders and made it look like C with some 
 awk, Self, Scheme, and even HyperCard (HyperTalk, actually) influences.
 
 Eclecticism is not an end, but it could be a means to a better end than a 
 cramped non-eclectic grammar, if the deeper reasons for concise lambda 
 syntax are sound and valid. Syntax is for users, it must be usably sweet. 
 It's not all about theoretical completeness and minimality.
 
 Anyway, we need a fun weekend thread, and everyone loves syntax. Comments? 
 Huzzahs? The latter go to Allen. Go nuts.
 
 /be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-09 Thread Brendan Eich
On May 9, 2011, at 2:21 AM, Irakli Gozalishvili wrote:
 On Monday, 2011-05-09 at 11:02 , Kyle Simpson wrote:
 
 Isn't that the spirit of what = would give us?
 
 Yes and this case makes following example extremely confusing:
 
 MyObject.prototype.bar = #(x) { this.bar = x }
 
 Is this instance of MyObject ? So we need to use `#` in some places, but in 
 other cases we need to stick to long form `function`. I think `-` and `=` 
 is way more intuitive and simple.

Exactly. Beyond the CoffeeScript precedent (pave the cowpaths) there is the 
EIBTI Python dictum. We should not add a shorthand for function that materially 
differs in semantics. Alex Russell argued this point with respect to # freezing 
and joining (that is, uniting object identity up to the nearest relevant 
closure). It applies to |this|-binding too.

It is hard to beed = for lexically bound |this| function vs. - for 
dynamically bound |this| function. I've tried. Any form that defaults to 
lexical-|this| and looks like a function from (...){...} on is going to mislead 
programmers, exaclty as you show above.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Isaac Schlueter
I wrote PHP full time for years.  - can get pretty aggravating.  # is
50% shorter, and doesn't use the same fingers that type the ().  ()-
is a lot of right-hand-dancing.

That being said, it does look pretty nice, and we're all just going to
set our editors to do that for us anyhow, right?

On Sat, May 7, 2011 at 20:52, Faisal Vali fais...@gmail.com wrote:
 Kyle Simpson get...@gmail.com
 Date: Sat, 7 May 2011 21:58:32 -0500
 Subject: Re: arrow syntax unnecessary and the idea that function is too 
 long

 snip

 With all due respect, Brendan's personal tastes on what kind of code he 
 likes to write is not enough.
 It has to be something that is likely to find wide spread support among the 
 JavaScript masses.


 Since the arrow syntax assailants have been quite vocal on this list,
 lest they be construed as representative of the javascript masses, I
 would like to voice a strong endorsement for pursuing and exploring
 the arrow syntax further - and I do this as a simple javascript
 hobbyist who uses javascript (and JQuery, for lack of the perfect
 library) extensively to automate tasks on windows (via htas) and to
 write RIAs.

 With all due respect to Mr. Simpson's personal tastes, I find the
 aesthetics of the arrow-syntax far more consistent with javascript's
 C-based-syntactic roots than the preprocessor-tainted '#' - but I
 also recognize that my personal aesthetic tastes are just that.
 Anyway, I hope that enough general users share my aesthetic and
 usability preference (short syntax for functionally well behaved and
 intuitive lambdas with closure capability) that the arrow syntax is
 given some serious thought and not dismissed because of this thread.

 Thanks!

 Faisal Vali
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Garrett Smith
On 5/7/11, Faisal Vali fais...@gmail.com wrote:
 Kyle Simpson get...@gmail.com
 Date: Sat, 7 May 2011 21:58:32 -0500
 Subject: Re: arrow syntax unnecessary and the idea that function is too
 long

 snip

 With all due respect, Brendan's personal tastes on what kind of code he
 likes to write is not enough.
 It has to be something that is likely to find wide spread support among
 the JavaScript masses.


 Since the arrow syntax assailants have been quite vocal on this list,
Yeah, not much vocal  whatevers, right?

I haven't seen much into the benefit of -. I haven't given it a whole
lot of thought and don't find it all that thrilling, really. Unusually
underopinionated for me, I know. Though If I was forced to pick
between - and #, I'd pick #.
-- 
Garrett
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Jorge
On 08/05/2011, at 05:52, Faisal Vali wrote:

 (...) I find the
 aesthetics of the arrow-syntax far more consistent with javascript's
 C-based-syntactic roots than the preprocessor-tainted '#' (...)

Consistent ?

- in C has a *totally* different meaning !
-- 
Jorge.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Jorge
On 08/05/2011, at 04:58, Kyle Simpson wrote:
 
 (...) So I felt like it was important to voice early that not everyone 
 feels universally so lovey-dovey over that syntax. (..)

What happened to Allen's lambda syntax proposal ?
When, why was it ditched in favor of - ?

Brendan, you liked it. What has happened ?

https://mail.mozilla.org/pipermail/es-discuss/2008-November/008216.html
-- 
Jorge.

Begin forwarded message:

 From: Brendan Eich bren...@mozilla.com
 Date: 30 de noviembre de 2008 07:30:14 GMT+01:00
 To: es-discuss@mozilla.org
 Subject: Allen's lambda syntax proposal
 
 At the TC39 meeting two weeks ago in Kona, we had a brief bikeshedding 
 discussion about lambda syntax and why it matters. Observation: blocks in 
 Smalltalk being lightweight means users don't mind writing them for control 
 abstractions, compared to JS functions in ES3. In Smalltalk, ignoring JS, 
 it's hard to beat [ and ] as overhead, although one must count the message 
 selector and its punctuation too.
 
 Allen Wirfs-Brock put his proposal, which will not shock you who know 
 Smalltalk or Allen, on the whiteboard:
 
 // Instead of lambda (a, b, c) { ... }, why not:
 { |a, b, c| ... } ?
 
 I then started to write an example of return to label, and in need of a 
 nested lambda, got stuck for a split second trying to write 
 function^H^H^H^H^H^H^H^lambda. After thinking 0.3 more seconds I then said I 
 will use Allen's proposed syntax. Pure win, readers and the writer (me) 
 agreed.
 
 I think someone proposed pretty much the same syntax here on es*-discuss 
 within the last two years, but I can't find that message at the moment.
 
 Bikeshed color is secondary to semantics, but lambda conciseness does matter. 
 I think Allen's homage to Smalltalk in JS wins. Every time I reach for more 
 verbose syntax my hand steers back to those || delimiters.
 
 Am I an old Smalltalk fan? Sure, I have Byte magazine with the balloons on 
 the cover still (in a box somewhere; mildewed, sadly). I'm the C hacker who 
 took the make it look like Java orders and made it look like C with some 
 awk, Self, Scheme, and even HyperCard (HyperTalk, actually) influences.
 
 Eclecticism is not an end, but it could be a means to a better end than a 
 cramped non-eclectic grammar, if the deeper reasons for concise lambda syntax 
 are sound and valid. Syntax is for users, it must be usably sweet. It's not 
 all about theoretical completeness and minimality.
 
 Anyway, we need a fun weekend thread, and everyone loves syntax. Comments? 
 Huzzahs? The latter go to Allen. Go nuts.
 
 /be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Faisal Vali
On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com wrote:
 On 08/05/2011, at 05:52, Faisal Vali wrote:

 (...) I find the
 aesthetics of the arrow-syntax far more consistent with javascript's
 C-based-syntactic roots than the preprocessor-tainted '#' (...)

 Consistent ?

 - in C has a *totally* different meaning !

Yes, but that is why I alluded to a syntactic commonality and not a
semantic one.
 But, I can see how the disparity in semantics might bother some programmers.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Rick Waldron
Just read
https://mail.mozilla.org/pipermail/es-discuss/2008-November/008218.html and
I'm buzzing with the idea of Lisp style functions as inspiration for a
short hand. While I realize the idea is likely absurd, but I'm thinking in
terms of concepts that _all_ JavaScript devs know and understand.

This is a super simple, first-pass, rough-draft, not-too-serious,
request-for-comments...

https://gist.github.com/961495

Rick



On Sun, May 8, 2011 at 1:51 PM, Faisal Vali fais...@gmail.com wrote:

 On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com wrote:
  On 08/05/2011, at 05:52, Faisal Vali wrote:
 
  (...) I find the
  aesthetics of the arrow-syntax far more consistent with javascript's
  C-based-syntactic roots than the preprocessor-tainted '#' (...)
 
  Consistent ?
 
  - in C has a *totally* different meaning !

 Yes, but that is why I alluded to a syntactic commonality and not a
 semantic one.
  But, I can see how the disparity in semantics might bother some
 programmers.
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Peter Michaux
On Sat, May 7, 2011 at 4:17 PM, David Herman dher...@mozilla.com wrote:

 But we are going to have to make a decision, and it simply won't
 be perfect. We're going to listen to everyone, consider the
 technical issues, and at the end of the day, make the best
 decision we can with imperfect information.

I hope the committee keeps in mind that it can choose not to include
any short function syntax. I know the committee knows that but I hope
it is near the top of the list as one of the options.


On Sat, May 7, 2011 at 4:40 PM, Kyle Simpson get...@gmail.com wrote:

 But, JSConf has just 150-200 JavaScript developers in attendance. While they
 are certainly some of the most passionate (and intelligent) developers of
 the community, no doubt, they are definitely not a representative sampling
 of the overall community. Making language decisions based on the vocal
 support of JSConf alone is not sufficient.

Agreed. I think the personality type of hundreds of developers that
attend conferences is quite different than the tens of thousands of
developers that don't attend.


 I think I could easily come up with a dozen examples of patterns in
 JavaScript coding which are shorter, but which most of the community would
 say is *not* more readable. So I take issue with the assertion that
 shorter==better unequivocally.

Agreed. There shouldn't be the feeling that shorter function syntax is
desperately needed and that it has to go into the next ES even if it
is not perfect.


On Sat, May 7, 2011 at 5:18 PM, Juan Ignacio Dopazo
dopazo.j...@gmail.com wrote:

 Brendan once said JS is a curly-brace language and it always will be. I
 think the - looks works very nice with a pythonic-like forced indentation
 like Coffeescript has. However, I believe # looks better with curly braces,
 so I'd keep #(x) { x * x }.
 I also think familiarity should be considered and that #(x) { x * x } would
 be more familiar to the casual JS programmer.

I agree with this type of thinking about keeping syntax similar with
arguments in parens and the body in braces more than introducing
something so foreign to JavaScript like the arrow syntax.


On Sat, May 7, 2011 at 7:33 PM, Isaac Schlueter i...@izs.me wrote:

 It has been my experience that professional JavaScripters will cheer
 *any* idea that shortens the spelling of function and return :)

There are professional JavaScript programmers in *this* thread that
aren't cheering. That is why this thread started.


On Sat, May 7, 2011 at 7:58 PM, Kyle Simpson get...@gmail.com wrote:

 So I felt like it was important to voice early that not everyone feels
 universally so lovey-dovey over that syntax. In fact, a recent tweet I read
 sums up my feelings: If I wanted to be using Coffeescript, I'd be using
 Coffeescript. I prefer JavaScript.

Exactly! There are syntactic features that some developers want that
are so far from JavaScript that they shouldn't or can't be
incorporated into the language. This is why compilers exist and I hope
that the to-JavaScript compiler community grows if people want to do
that sort of thing.

I've talked with some JavaScript developers and asked them What do
you think of Coffeescript? without biasing my question. I've had a
100% negative response. They aren't interested in using Coffeescript
_at_all_. So just because Coffeescript has some vocal fans, it has not
caught on like wildfire. In the big scheme of things it has virtually
not caught on at all. It is a very fringe group that is experimenting.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Irakli Gozalishvili
I'm really happy that arrow syntax proposal was made and thanks a lot Brendan!!

I'd like to point out that coffeescript has a huge success and in the end it's 
just syntax sugared js. I think this is quite good proof that syntax change 
like this is more then welcome. 

Another thing I'd like to point out that arrow function is not just saving 
keystrokes of typing `function` and `return`, but also gives even bigger win 
IMO via `=` when binding of `this` pseudo variable is desired. This case BTW 
was not addressed by `#`. Even though `-` is one more char in comparison to 
`#`, `=` is much less then `.bind(this)`, in addition having both - and = 
feels just natural!

Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/
Address: 29 Rue Saint-Georges, 75009 Paris, France

On Sunday, 2011-05-08 at 19:09 , Rick Waldron wrote: 
 Just read 
 https://mail.mozilla.org/pipermail/es-discuss/2008-November/008218.html and 
 I'm buzzing with the idea of Lisp style functions as inspiration for a 
 short hand. While I realize the idea is likely absurd, but I'm thinking in 
 terms of concepts that _all_ JavaScript devs know and understand. 
 
 This is a super simple, first-pass, rough-draft, not-too-serious, 
 request-for-comments... 
 
 https://gist.github.com/961495
 
 Rick
 
 
 
 On Sun, May 8, 2011 at 1:51 PM, Faisal Vali fais...@gmail.com wrote:
  On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com wrote:
   On 08/05/2011, at 05:52, Faisal Vali wrote:
  
   (...) I find the
   aesthetics of the arrow-syntax far more consistent with javascript's
   C-based-syntactic roots than the preprocessor-tainted '#' (...)
  
   Consistent ?
  
   - in C has a *totally* different meaning !
  
  Yes, but that is why I alluded to a syntactic commonality and not a
   semantic one.
  But, I can see how the disparity in semantics might bother some programmers.
  ___
   es-discuss mailing list
  es-discuss@mozilla.org
  https://mail.mozilla.org/listinfo/es-discuss
  
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss
 
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Peter Michaux
On Sun, May 8, 2011 at 11:34 AM, Irakli Gozalishvili rfo...@gmail.com wrote:

 I'd like to point out that coffeescript has a huge success and in the end
 it's just syntax sugared js.

Can someone give evidence that Coffeescript is actually a success? Has
anyone crawled the web to determine the rate of Coffeescript adoption?
(Assuming there is some way to identify Coffeescript's compiled code.)
Will adoption plateau at a small percentage of total browser scripts?

People cannot just reiterate this idea that Coffeescript is popular
and use that as support for arrows without evidence that Coffeescript
is actually popular.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Dave Herman
Do I understand you that the idea here is 'function' without the 'function' 
keyword? I think this has a pretty bad backwards-incompatibility with ASI:

x = (x)
{ return x }

Which way should this parse?

Dave
-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

Rick Waldron waldron.r...@gmail.com wrote:

Just read 
https://mail.mozilla.org/pipermail/es-discuss/2008-November/008218.html and I'm 
buzzing with the idea of Lisp style functions as 

inspiration for a short hand. While I realize the idea is likely absurd, but 
I'm thinking in terms of concepts that _all_ JavaScript devs know and 
understand. 


This is a super simple, first-pass, rough-draft, not-too-serious, 
request-for-comments... 


https://gist.github.com/961495


Rick




On Sun, May 8, 2011 at 1:51 PM, Faisal Vali fais...@gmail.com wrote:

On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com wrote:
 On 08/05/2011, at 05:52, Faisal Vali wrote:

 (...) I find the
 aesthetics of the arrow-syntax far more consistent with javascript's
 C-based-syntactic roots than the preprocessor-tainted '#' (...)

 Consistent ?

 - in C has a *totally* different meaning !

Yes, but that is why I alluded to a syntactic commonality and not a
semantic one.
 But, I can see how the disparity in semantics might bother some programmers.

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-08 Thread Andrew Dupont
Presumably it could be defined in the grammar so as to prohibit a newline in 
that very place, much like how the return statement is defined.

Alternatively: someone in this thread asked whether there was any purpose to 
blocks in ES when they aren't used for try/catch/finally or other such 
purposes. In other words, is there any reason not to restrict them to those use 
cases and thus remove this ambiguity?

Cheers,
Andrew


On May 8, 2011, at 11:20 PM, Dave Herman wrote:

 Do I understand you that the idea here is 'function' without the 'function' 
 keyword? I think this has a pretty bad backwards-incompatibility with ASI:
 
 x = (x)
 { return x }
 
 Which way should this parse?
 
 Dave
 -- 
 Sent from my Android phone with K-9 Mail. Please excuse my brevity.
 
 Rick Waldron waldron.r...@gmail.com wrote:
 Just read 
 https://mail.mozilla.org/pipermail/es-discuss/2008-November/008218.html and 
 I'm buzzing with the idea of Lisp style functions as inspiration for a 
 short hand. While I realize the idea is likely absurd, but I'm thinking in 
 terms of concepts that _all_ JavaScript devs know and understand. 
 
 This is a super simple, first-pass, rough-draft, not-too-serious, 
 request-for-comments... 
 
 https://gist.github.com/961495
 
 Rick
 
 
 
 On Sun, May 8, 2011 at 1:51 PM, Faisal Vali fais...@gmail.com wrote:
 On Sun, May 8, 2011 at 4:04 AM, Jorge jo...@jorgechamorro.com wrote:
  On 08/05/2011, at 05:52, Faisal Vali wrote:
 
  (...) I find the
  aesthetics of the arrow-syntax far more consistent with javascript's
  C-based-syntactic roots than the preprocessor-tainted '#' (...)
 
  Consistent ?
 
  - in C has a *totally* different meaning !
 
 Yes, but that is why I alluded to a syntactic commonality and not a
 semantic one.
  But, I can see how the disparity in semantics might bother some programmers.
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss
 
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Peter Michaux
On Fri, May 6, 2011 at 10:49 PM, Andrew Dupont mozi...@andrewdupont.net wrote:

 On May 7, 2011, at 12:42 AM, Peter Michaux wrote:

 Yes and readability counts. JavaScript's function syntax is already
 *highly* usable and readable.

 Many people, including me, would disagree.

Do you really struggle using or reading the current function syntax?

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Kyle Simpson
Many people, including me, would disagree. On matters of taste, I'd want 
the committee to listen to all interested parties and try to pick the 
solution that pleases the most people. That appears to be what's happening 
here.


Based on what evidence are we concluding that the majority of the 
javascript developers want - syntax for functions? The fact that 
coffeescript is the hot buzzword? Was there some developer-community wide 
voting or poll that I missed? Or is it that a few vocal people on these 
lists like it, and that's being substituted as what the majority is in 
favor of?


I'm not just being snarky, I'm genuinely curious, on this and a variety of 
other matters related to what's being added to ES-next/harmony... It's clear 
Brendan (and other language cohorts) likes these new syntax sugars, but 
where is the evidence that suggests that all this new syntax sugar is the 
exact sugar that javascript developers want? Is it just enough that everyone 
at JSConf likes it, and thus that means that the whole community is assumed 
to be on board?


There's LOTS of examples where writing less JavaScript is more awesomer, but 
there's also plenty of examples of where writing less is much more uglier. I 
am troubled by the implication that just because we've found a shorter 
syntax sugar for functions, this unequivocally means it's better.


- syntax being shorter is a clear and objective question. No doubt it's 
shorter. But is is prettier or more readable? According to who's opinion do 
we conclude that, because that seems pretty subjective.


--Kyle



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Peter Michaux
On Fri, May 6, 2011 at 11:05 PM, Andrew Dupont mozi...@andrewdupont.net wrote:

 I don't want to get too deep into matters of taste, but I do think the 
 current syntax is annoyingly verbose for passing lambdas as arguments in 
 other functions. The fact that it's so verbose ends up hurting readability 
 when the function itself is short.

I think that this is what compilers and projects like coffeescript are
for. In my opinion, JavaScript itself doesn't need this new syntax.

I think improving JavaScript as a compilation target is a good goal.
For example, a real lambda with guaranteed proper tail calls, no
arguments, no need for return, etc would make is possible to
compile Scheme to JavaScript without using something inefficient like
trampolines. It would also open up recursive programming options in
plain JavaScript so it would be win-win.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Jorge
On 07/05/2011, at 02:04, Peter Michaux wrote:
 (...)
 
 If the arrow syntax is only syntactic sugar for the existing function
 forms then I don't see how it achieves any of the goals he outlined.
 The only possible category is be a better language but the arrow
 syntax won't make JavaScript a better language for complex
 applications or libraries in comparison to any other kind of
 JavaScript code. I would argue that the arrow syntax will make
 JavaScript a worse language anyway as there are already perfectly good
 forms using the function keyword now. We don't need new syntax and
 we don't need multiple ways to do the same thing just for the sake 6
 characters. Please keep JavaScript simple.
 
 (...)

This above is ~ how I feel about it too.

But if I wanted a shorter syntax, I would no doubt choose ruby blocks' syntax, 
it's even shorter yet and it's familiar already to millions of programmers.

On 07/05/2011, at 03:22, David Bruant wrote:
 
 I'm attracted to the idea of a shorter function syntax not only because
 it reduces the number of characters of the function keyword, but also
 because it gets rid of the return keyword (and corresponding semicolon).

(return does not need the semicolon ;-)

 The particular case where I would enjoy shorter syntax is when using
 inlined functions in array extras.
 
 // assuming a is an array
 a.filter( (e)-(typeof e === number  e3) )
 .map( (e)-(e*e) )
 .reduce( (prev, curr)-(prev+curr), 0);

Using ruby blocks' syntax (+6 versus +4 chars):

a.filter( {|e| typeof e === number  e3})
 .map({|e| e*e } )
 .reduce( {|prev, curr| prev+curr}, 0);

Is {| as a token likely to be found in any .js source file in the world, as 
of today ?

- Not in any object literal
- Not likely to be found at the beginning of a block.
- Inside a string it would not matter.
-- 
Jorge.___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread François REMY
Just to add my two cents, I would like to let you remember that the arrow 
syntax should not be viewn as the only way to avoid the 'return' statement 
and the brackets. function(x) x*x; does the trick too, whithout 
introducing any new keyword. To those that think that the arrow syntax is 
easier to type because there's less characters to type, it may be 
disappointing to notice it's not the case : (x) - x*x; is only 5 
characters shorter than the other form but :


   - You don't beneficiate from autocompletion anymore (in most IDE, typing 
'fun+TAB' brings up 'function' arlready)


   - The '-' and the '' characters are more complex to type (on my 
keyboard, both then - and the  char requires me to move my hand away from 
its standards position, and the time it takes to type ' - ' equals or is 
more important than the time I need to type 'function' in *full* word, which 
I usually don't need to).


   - The syntax is less clear. CSharp originally introduced something like 
that in the past, and I never liked the syntax. (It's to notice that the 
VB.NET language later implemented the lambda feature using the Function(X) 
X*X syntax). Okay, if I could really choose, I would prefer the @(x) x*x; 
syntax, which is already implemented as-is in other scripting languages 
such as MatLAB (but I already hear the concerns about other possible usages 
of the @ sign).


   - It introduces ambiguities in the code (Sample: var z = (x) - x || y)

Regards,
François


-Message d'origine- 
From: Brendan Eich

Sent: Saturday, May 07, 2011 3:39 AM
To: Peter Michaux
Cc: es-discuss@mozilla.org
Subject: Re: arrow syntax unnecessary and the idea that function is too 
long


On May 6, 2011, at 5:04 PM, Peter Michaux wrote:


The only possible category is be a better language but the arrow
syntax won't make JavaScript a better language for complex
applications or libraries in comparison to any other kind of
JavaScript code.


Usability is always on the top three lists of programming language success 
factors. 'function' and 'return' are too long.




I would argue that the arrow syntax will make
JavaScript a worse language anyway as there are already perfectly good
forms using the function keyword now.


Eight characters is at least six too many.



We don't need new syntax and
we don't need multiple ways to do the same thing just for the sake 6


Wrong, 14. You are not counting 'return'.



characters. Please keep JavaScript simple.


Sorry, this is a bogus argument. Simple does not mean fewest productions 
in all possible grammars or fewest ways of saying any given sentence. 
That is simpler by some measures, more complex by others. In particular, 
writing and (lesser but still material) reading 'function' over and over is 
not a win.


Consider the destructuring object shorthand: let {x, y} = pt; instead of let 
{x:x, y:y} = pt;




Look at all the complex/subtle edge cases mentioned in the wiki page
about arrow function syntax. Do we really want to have that much
trickiness added to the language?


The wiki page is a work in progress. I have updates coming, which should 
address the parenthesization burden. But again, you can use 14 characters if 
you want. This is shorthand, and only shorthand. And usability counts, so 
shorthands are in Harmony (e.g., destructuring)


Gzip is not the issue (although stats I've seen from Steve Souders show too 
may scripts not being compressed at the Transfer-encoding layer). Human 
usability is.


/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss 


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Sam Tobin-Hochstadt
On Sat, May 7, 2011 at 2:22 AM, Peter Michaux petermich...@gmail.com wrote:

 I think that this is what compilers and projects like coffeescript are
 for. In my opinion, JavaScript itself doesn't need this new syntax.

 I think improving JavaScript as a compilation target is a good goal.

This argument comes up time and again: We don't need to make
JavaScript a good programming language, just a good compilation
target. I think it's really wrong-headed.  First, JavaScript is a
language used by millions of people as a programming language, and we
should give them a great language to program in.  Second, JavaScript
as source rather than target has been a huge enabler of the Web as an
open platform, which I certainly don't want to move away from.  So,
even though we've worked hard in the module system to better support
compilation to JavaScript, I think the our fundamental goal should be
to make JavaScript a great language to write all kinds of programs in.

 For example, a real lambda with guaranteed proper tail calls, no
 arguments, no need for return, etc would make is possible to
 compile Scheme to JavaScript without using something inefficient like
 trampolines. It would also open up recursive programming options in
 plain JavaScript so it would be win-win.

And hey, it turns out we've done this too -- at least with the - syntax.  :)
-- 
sam th
sa...@ccs.neu.edu
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Peter Michaux
On Sat, May 7, 2011 at 6:04 AM, Sam Tobin-Hochstadt sa...@ccs.neu.edu wrote:
 On Sat, May 7, 2011 at 2:22 AM, Peter Michaux petermich...@gmail.com wrote:

 I think that this is what compilers and projects like coffeescript are
 for. In my opinion, JavaScript itself doesn't need this new syntax.

 I think improving JavaScript as a compilation target is a good goal.

 This argument comes up time and again: We don't need to make
 JavaScript a good programming language,

JavaScript is already a good programming language. It can use
improvements but it has good covered.

 just a good compilation
 target.

I did not write that it needs to be just a good compilation target.

I don't use a compiler to enable me to write source in another
language and then serve JavaScript to the browser. I write in
JavaScript. So I do want JavaScript to remain a good language.

That said, improving JavaScript as a compilation target does expose
areas where the language could use features it does not have at all
(in any syntax.) Adding those features makes JavaScript objectively a
more capable language.

 I think it's really wrong-headed.

Me too.

 First, JavaScript is a
 language used by millions of people as a programming language, and we
 should give them a great language to program in.

JavaScript already has great covered too. :-) I'd be willing to go
for even better but the arrow syntax isn't even a significant
contribution to this cause. Real features would be. A weak map, for
example, is a great idea because we just cannot do anything like that
now without implementing our own garbage collection.

 Second, JavaScript
 as source rather than target has been a huge enabler of the Web as an
 open platform, which I certainly don't want to move away from.  So,
 even though we've worked hard in the module system to better support
 compilation to JavaScript, I think the our fundamental goal should be
 to make JavaScript a great language to write all kinds of programs in.

That wasn't one of Brendan's stated goals; however, it is a good goal.
I think the arrow syntax is not helpful in this goal.

 For example, a real lambda with guaranteed proper tail calls, no
 arguments, no need for return, etc would make is possible to
 compile Scheme to JavaScript without using something inefficient like
 trampolines. It would also open up recursive programming options in
 plain JavaScript so it would be win-win.

 And hey, it turns out we've done this too -- at least with the - syntax.  :)

It has been confirmed that the arrow syntax is *only* syntactic sugar
for existing function syntax. That means introducing the arrow syntax
does *not* improve the compilation Scheme to JavaScript *at all*.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Thaddee Tyl
On Sat, May 7, 2011 at 6:31 PM, Peter Michaux petermich...@gmail.com wrote:
 On Sat, May 7, 2011 at 9:16 AM, Thaddee Tyl thaddee@gmail.com wrote:
 I believe that David Bruant has a good point. We *need* a shorter syntax
 because we advocate the use of map/reduce, etc., which require simple
 anonymous functions.

 No. We don't need syntactic sugar. The current function syntax is
 working and we are talking a few characters difference, not hundreds.

 Map/reduce don't require syntactic sugar.

It is not a requirement, indeed. I feel like it is a need, however.
JavaScript is still seen as a badly object-oriented programming
language by those who still think it is java with a weird syntax. I do
hope it grows to be known as an outstanding functional programming
language. Thanks to ES5's strict mode, it now gets freed from the
this issue, for those that use it.

Huffmanization requires that we reduce the size of what we want to use
often. If we want to use more functions, then it isn't just eleven
less characters once in a while, it becomes a bigger deal!

 There are so many more important issues to address.

If you feel like addressing more important issues, I warmly beg you to do so!
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Peter Michaux
On Sat, May 7, 2011 at 9:56 AM, Thaddee Tyl thaddee@gmail.com wrote:

 JavaScript is still seen as a badly object-oriented programming
 language by those who still think it is java with a weird syntax.

I think that concpetion has declined a lot as rich clients have forced
people to become better acquainted with JavaScript and a lot more has
been written on the language.

 I do
 hope it grows to be known as an outstanding functional programming
 language.

JavaScript won't ever be known as a outstanding functional programming
language until it has proper tail calls. This would give the language
new capabilities it doesn't have now.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Isaac Schlueter
For what it's worth, I'm a *huge* fan of Ruby's {|-style blocks.
Also, it's worth noting that do...done seems to be a bit more
popular in Ruby programs that I've seen.

I'm not a fan of the fact that these blocks have different behavior
than regular functions and methods, but that's a qualm for a
different mailing list, and I'm not a rubyist anyhow :)

Consider this: w = (x)-y || z

That code is not obvious at all.  Which of these would it be?

1: w = function (x) { return y } || z
2: w = function (x) { return y || z }

It seems to me that there must be some sort of delineation around the
function start and end.  I agree that function ... return is way too
many characters to write and read for such a fundamental bit of
syntax.

This style is quite clear and readable:

w = {|x| y || z}
w = {|x| y} || z

However, that's pretty awful to type.  Perhaps even worse than -.
Maybe {(x) y || z} might be better?  Of course, that would break
blocks that start with parenthesized sequence blocks, but is that
really a concern?  Blocks in JS are useless, can't we just do away
with them?

On Sat, May 7, 2011 at 10:04, Peter Michaux petermich...@gmail.com wrote:
 On Sat, May 7, 2011 at 9:56 AM, Thaddee Tyl thaddee@gmail.com wrote:

 JavaScript is still seen as a badly object-oriented programming
 language by those who still think it is java with a weird syntax.

 I think that concpetion has declined a lot as rich clients have forced
 people to become better acquainted with JavaScript and a lot more has
 been written on the language.

 I do
 hope it grows to be known as an outstanding functional programming
 language.

 JavaScript won't ever be known as a outstanding functional programming
 language until it has proper tail calls. This would give the language
 new capabilities it doesn't have now.

 Peter
 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Garrett Smith
On 5/7/11, Isaac Schlueter i...@izs.me wrote:

[...]

  Blocks in JS are useless, can't we just do away
 with them?

Blocks are required for many productions such as try/catch/finally.
Almost all existing code uses blocks to group statements together.
Blocks can't be removed.
-- 
Garrett
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Sam Tobin-Hochstadt
On Sat, May 7, 2011 at 1:04 PM, Peter Michaux petermich...@gmail.com wrote:

 JavaScript won't ever be known as a outstanding functional programming
 language until it has proper tail calls. This would give the language
 new capabilities it doesn't have now.

http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls (note
that it's in the Harmony namespace, meaning that it's been approved as
a proposal).

-- 
sam th
sa...@ccs.neu.edu
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Claus Reinke

Consider this: w = (x)-y || z

That code is not obvious at all.  Which of these would it be?

1: w = function (x) { return y } || z
2: w = function (x) { return y || z }

It seems to me that there must be some sort of delineation 
around the function start and end.  


But such delineation does not have to lead to required syntax
in the function construct. Such required delineations were not
part of lambda-calculus originally **, they arose out of 
implementation limitations that can be overcome.


I know that takes some getting used to (been there myself*), 
but there is an established standard, both in publications on
programming language theory, and in some real languages: 


   function bodies extend as far as possible **

So your examples would be

1: w = (function (x) return y) || z
2: w = (function (x) return y || z)

If the right-hand side itself is delimited, 2 could also be written

2': w = function (x) return y || z

The idea is that we can always shorten an unbounded function 
by enclosing it with existing grouping constructs, but we cannot 
lengthen a pre-delineated function in any way, nor can we get

rid of the delineating parens and braces if they are required in
the grammar. Combining non-delineated functions with grouping
constructs gives us a modular and unambiguous solution.

Another issue is that of blocks in function bodies. It would be
nice if blocks were values - then procedures would just be
block-returning functions, and all functions would just return
values, separating the function construct from the details of
block execution. Not sure whether such niceties would work 
in javascript, though:-)


Claus

* I used to write my lambda-calculus terms fully parenthesized,
   because the functional languages I knew (before Haskell) 
   required that style. Many programming language theory
   folks found that style difficult to read, because they had 
   grown up with the extends-as-far-as-possible convention. 


** Church,  Barendregt, .., they all define lambda-terms as

   term := x | (\x term) | (term term)

   with additional conventions to drop parentheses where
   possible, such as

   (A B C D) instead of (((A B) C) D)
   (\x y z.M) instead of (\x (\y (\z M)))


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread David Herman
 Based on what evidence are we concluding that the majority of the 
 javascript developers want - syntax for functions? The fact that 
 coffeescript is the hot buzzword? Was there some developer-community wide 
 voting or poll that I missed? Or is it that a few vocal people on these lists 
 like it, and that's being substituted as what the majority is in favor of?

IIRC there were cheers at JSConf this week.

But you're looking for something that doesn't exist: a way to make 
scientifically sound decisions about language design. There is *no* way to 
resolve syntax questions perfectly. We welcome community input, all community 
input. But we are going to have to make a decision, and it simply won't be 
perfect. We're going to listen to everyone, consider the technical issues, and 
at the end of the day, make the best decision we can with imperfect information.

Dave

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Kyle Simpson
Based on what evidence are we concluding that the majority of the 
javascript developers want - syntax for functions? The fact that 
coffeescript is the hot buzzword? Was there some developer-community wide 
voting or poll that I missed? Or is it that a few vocal people on these 
lists like it, and that's being substituted as what the majority is in 
favor of?


IIRC there were cheers at JSConf this week.


Yeah, I unfortunately wasn't able to attend. I was quite sad about missing 
JSConf for the first time.


But, JSConf has just 150-200 JavaScript developers in attendance. While they 
are certainly some of the most passionate (and intelligent) developers of 
the community, no doubt, they are definitely not a representative sampling 
of the overall community. Making language decisions based on the vocal 
support of JSConf alone is not sufficient. I was certain there had to be 
more behind the claim than just that. So that's what I was asking for.



But you're looking for something that doesn't exist: a way to make 
scientifically sound decisions about language design.


I am not looking for any such thing. I was looking for more detail behind 
Brendan's (and Andrew's) assertions that - is definitively better because 
it's shorter (and for no other stated reason).



There is *no* way to resolve syntax questions perfectly. We welcome 
community input, all community input.


I don't claim that any such perfect system could be devised. I was merely 
responding to Andrew's insinuation that the majority of the community 
(including him) had already voiced support for -. If someone makes an 
implication, I think it's fair game on here to ask for the supporting 
reasoning.


I think I could easily come up with a dozen examples of patterns in 
JavaScript coding which are shorter, but which most of the community would 
say is *not* more readable. So I take issue with the assertion that 
shorter==better unequivocally.



But we are going to have to make a decision, and it simply won't be 
perfect. We're going to listen to everyone, consider the technical issues, 
and at the end of the day, make the best decision we can with imperfect 
information.


From the tone of this thread, and from many other recent postings regarding 
reactions from JSConf this week, it sounded like all of a sudden we'd gone 
from yeah coffeescript has some interesting short-hand syntax to the 
community has spoken, and coffeescript will be adopted into ES.Harmony/Next 
as-is.


I was, and am now, still wondering how we so quickly made the leap from 
Brendan's harmony of my dreams a couple of months ago, where the idea of # 
sounded good, and plausible for inclusion, all the way to Brendan declaring 
that it's basically a done deal that we'll be including a variety of 
function and other shorthands from coffeescript post haste?




--Kyle



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread David Herman
 But, JSConf has just 150-200 JavaScript developers in attendance.

Right. The JS community has no borders, no government, no constitution, no 
membership cards, no census... We welcome everyone. So we have no way of 
instituting democratic institutions.

 they are definitely not a representative sampling of the overall community. 
 Making language decisions based on the vocal support of JSConf alone is not 
 sufficient.

I can only repeat what I said before. There's no magic way to figure out 
accurately what most people want. The best we can do is publicize, solicit 
feedback, discuss, and make a decision. As we have always done.

 I was merely responding to Andrew's insinuation that the majority of the 
 community (including him) had already voiced support for -.

You have no way of knowing Andrew was insinuating that. I saw only the 
eminently reasonable point that we will never be able to please everyone, and 
will have to *try* to please as many people as possible.

 I take issue with the assertion that shorter==better unequivocally.

I don't know whether anyone actually made that assertion. But in the case of 
function literals, there is a *ton* of precedent for languages with very 
concise syntax, and lots of experience to show that the conciseness is a win 
here.

 From the tone of this thread, and from many other recent postings regarding 
 reactions from JSConf this week, it sounded like all of a sudden we'd gone 
 from yeah coffeescript has some interesting short-hand syntax to the 
 community has spoken, and coffeescript will be adopted into ES.Harmony/Next 
 as-is.

Hey, take a deep breath.

1) If you read the draft strawman, you'll see it's not exactly the same as the 
CoffeeScript syntax.

2) Brendan has been describing a strawman he is proposing at the next 
face-to-face meeting.

3) The strawman has not yet been promoted to Harmony status.

4) We *always* go to great pains to make it clear that nothing is final until 
the standard has been approved, which is slated for 2013. So even if it were at 
Harmony status, it wouldn't be final.

You're reading into perceived tone and insinuation (your words) things that 
are directly contradicted by verifiable facts. Syntax discussions are difficult 
and controversial. If you want to contribute productively, please assume good 
faith on the part of your interlocutors. I think you'll find the assumption 
holds up.

Dave

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Juan Ignacio Dopazo
Since there's a call for developer feedback, I'll give mine.

Brendan once said JS is a curly-brace language and it always will be. I
think the - looks works very nice with a pythonic-like forced indentation
like Coffeescript has. However, I believe # looks better with curly braces,
so I'd keep #(x) { x * x }.

I also think familiarity should be considered and that #(x) { x * x } would
be more familiar to the casual JS programmer.

Juan
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Rick Waldron
David,

Thanks for those clarifying points, much appreciated.

From an academic perspective, I'm also curious about the change from # to -gt;

To be honest, # always seemed weird to me, but I welcome a shortened syntax 
regardless


Rick



-- Sent from my Palm Pre
On May 7, 2011 8:18 PM, Juan Ignacio Dopazo lt;dopazo.j...@gmail.comgt; 
wrote: 

Since there's a call for developer feedback, I'll give mine.
Brendan once said JS is a curly-brace language and it always will be. I think 
the -gt; looks works very nice with a pythonic-like forced indentation like 
Coffeescript has. However, I believe # looks better with curly braces, so I'd 
keep #(x) { x * x }.


I also think familiarity should be considered and that #(x) { x * x } would be 
more familiar to the casual JS programmer.
Juan

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Isaac Schlueter
It has been my experience that professional JavaScripters will cheer
*any* idea that shortens the spelling of function and return :)

Brendan has said that 8 characters for function is at least 6 too
many.  I think it's probably at least 7 too many.  But it'd be a shame
to remove the character-count-tax only to introduce a
twisting-wrist-tax.  I'd prefer something closer to the middle of
(most) keyboards than - or {|.  #() is pretty nice, actually.

When I suggested doing away with blocks, I of course was not
referring to structures where the block is relevant, such a function
bodies, if/else, try/catch/finally, or loops.  I was talking about
having a bare unadorned block in JavaScript.  These are relevant in C,
where you have block-scope, but in JavaScript have only made it
trickier to know whether something is supposed to be an Object-literal
or a block with labelled lines.  For example:

return {
  foo: bar
}
// vs
return
{
  foo: bar
}



On Sat, May 7, 2011 at 14:39, Claus Reinke claus.rei...@talk21.com wrote:
   function bodies extend as far as possible **

I see.  So, a function body would be just like an if-block or loop
body.  One full statement, or a block.  There is precedent for that in
the rest of the language.  So, then, this case:

x = function () y; z

would be:

x = function () { return y }; z

am I understanding that correctly?

--i
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Kyle Simpson

But, JSConf has just 150-200 JavaScript developers in attendance.


Right. The JS community has no borders, no government, no constitution, no 
membership cards, no census... We welcome everyone. So we have no way of 
instituting democratic institutions.


they are definitely not a representative sampling of the overall 
community. Making language decisions based on the vocal support of JSConf 
alone is not sufficient.


I can only repeat what I said before. There's no magic way to figure out 
accurately what most people want. The best we can do is publicize, solicit 
feedback, discuss, and make a decision. As we have always done.


OK, it's fair to point out that an attempt is being made. I'm asking though 
for the resulting evidence from that attempt. As far as I can tell (and 
please correct me if I'm wrong), there's been a few discussions on some 
rather-esoteric lists/threads, like es-discuss, a few strawmans, and some ad 
hoc presentations as JSConf. If there's a signficant medium of exchange of 
opinions and ideas about topics that I'm NOT listing there, please do tell 
me. I like to think I keep on the pulse of the JS community (generally 
speaking), and so I'm anxious to hear if and how I'm missing out.


If OTOH those few mediums do constitute the breadth of community opinion 
solicitation thus far regarding specifically the matters of these 
coffeescript shorthands, as I was previously inclined to believe, then my 
original assertion stands, that this doesn't constitute, in my opinion, 
enough of the broader perspectives on what is and is not useful and readable 
JavaScript. With all due respect, Brendan's personal tastes on what kind of 
code he likes to write is not enough. It has to be something that is likely 
to find wide spread support among the JavaScript masses.


And if we're looking for any kind of guide as to what they might like 
(because we cannot scientifically poll all of them, obviously), then might I 
suggest that the community that's grown up around jQuery (and its associated 
projects, plugin ecosystem, etc) is a place to start. I am not in any way 
suggesting jQuery is the only style of code out there, by any means. But it 
clearly represents a wide swath of how JavaScript developers are currently 
using the language. And jQuery is unique enough in its syntactic 
eccentricities (its chaining, etc) that it may offer some insights.


To the extent that jQuery syntax encourages people to take shortcuts, it 
could be seen as support for shorter syntax. And to the extent that jQuery 
uses lots of anonymous functions, it could be seen as an opportunity to 
shorten all that function soup.


But, by the same token, jQuery preserves verbosity in some places for 
readability sake. For instance, event names are known by their full 
canonical names, rather than by some shorthand (similarly with attribute and 
property names). I can say as many times as I write `click(...)` or 
`bind(click...)`, I could see where `c` or `clk` might be nice to have, to 
save on all that typing. But, it would probably be for a loss of readability 
and semantics of the code.


So there has to be a careful balance struck between shortness and 
readability. I think at least a few of us are saying that we're skeptical 
that - is sufficiently readable and semantic, compared to function(){} or 
#(){}. The same goes for the loss of `return`... Having `return` in there is 
a good thing, I think, because it makes it clear what's being returned. I 
often write complex functions with internal branching logic, where there's 
more than one `return` statement, and so it scares me to think how I could 
inspect and understand such code as readily/easily if the `return` was 
implicit, for instance, only the last evaluated expression, etc.



I was merely responding to Andrew's insinuation that the majority of the 
community (including him) had already voiced support for -.


You have no way of knowing Andrew was insinuating that. I saw only the 
eminently reasonable point that we will never be able to please everyone, 
and will have to *try* to please as many people as possible.


Andrew's original message (in part):
I'd want the committee to listen to all interested parties and try to pick 
the solution that pleases the most people. That appears to be what's 
happening here.


The phrase That appears to be what's happening here, following after the 
committee...listen...pick sentence before, led me to believe that Andrew 
was indicating that the movement to adopt Coffeescript-like shorthand was a 
result of the committee *having already listened* and *having already 
picked* a solution that most people agreed with. It was the implication of 
this has already been happening I reacted to. If I misread it, I 
apologize. But my interpretation was fueled strongly by half a dozen blog 
posts and dozens of tweets from JSConf and post-JSConf which seemed to 
suggest that this stuff was already basically a done-deal.





I take 

Re: arrow syntax unnecessary and the idea that function is too long

2011-05-07 Thread Faisal Vali
 Kyle Simpson get...@gmail.com
 Date: Sat, 7 May 2011 21:58:32 -0500
 Subject: Re: arrow syntax unnecessary and the idea that function is too long

snip

 With all due respect, Brendan's personal tastes on what kind of code he likes 
 to write is not enough.
 It has to be something that is likely to find wide spread support among the 
 JavaScript masses.


Since the arrow syntax assailants have been quite vocal on this list,
lest they be construed as representative of the javascript masses, I
would like to voice a strong endorsement for pursuing and exploring
the arrow syntax further - and I do this as a simple javascript
hobbyist who uses javascript (and JQuery, for lack of the perfect
library) extensively to automate tasks on windows (via htas) and to
write RIAs.

With all due respect to Mr. Simpson's personal tastes, I find the
aesthetics of the arrow-syntax far more consistent with javascript's
C-based-syntactic roots than the preprocessor-tainted '#' - but I
also recognize that my personal aesthetic tastes are just that.
Anyway, I hope that enough general users share my aesthetic and
usability preference (short syntax for functionally well behaved and
intuitive lambdas with closure capability) that the arrow syntax is
given some serious thought and not dismissed because of this thread.

Thanks!

Faisal Vali
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-06 Thread David Bruant
Le 07/05/2011 02:04, Peter Michaux a écrit :
 I'd like to ask when is function too long? I never type it thanks to
 my text editor's features so I know it is not too long for developers
 with a good editor.
What editor are you using? I have always been disappointed in my
experience with IDEs and JavaScript integration and would be glad to
know what people use for JavaScript (I'm actually asking the question to
everyone).

I'm attracted to the idea of a shorter function syntax not only because
it reduces the number of characters of the function keyword, but also
because it gets rid of the return keyword (and corresponding semicolon).
The particular case where I would enjoy shorter syntax is when using
inlined functions in array extras.

// assuming a is an array
a.filter( (e)-(typeof e === number  e3) )
 .map( (e)-(e*e) )
 .reduce( (prev, curr)-(prev+curr), 0);

This is obviously extremely subjective, I admit. And there is no right
or wrong answer/opinion, it's really a matter of taste.
I actually prefer the idea of the # notation, because it looks more
like a function with its brackets ({ and }) while in my example,
without any help of syntax highlighting, the reader can easily get lost
in nested parenthesis. Same example with #:

// assuming a is an array
a.filter( #(e){typeof e === number  e3} )
 .map( #(e){e*e} )
 .reduce( #(prev, curr){prev+curr}, 0);

This looks more clear to me. But once again, this is very subjective.


Your message seems to assume that the choice of providing a shorter
syntax is to help JS code writer. I have the opposite opinion: a shorter
syntax should be introduced to help code readers.
In most cases I have seen for array extras functions, the function has
only one return statement. While reading the code, having the function
inlined avoids to look for the function in some other place in the code
and getting rid of a dozen character makes the line shorter without
introducing ambiguity.

My two cents,

David
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-06 Thread Brendan Eich
On May 6, 2011, at 5:04 PM, Peter Michaux wrote:

 The only possible category is be a better language but the arrow
 syntax won't make JavaScript a better language for complex
 applications or libraries in comparison to any other kind of
 JavaScript code.

Usability is always on the top three lists of programming language success 
factors. 'function' and 'return' are too long.


 I would argue that the arrow syntax will make
 JavaScript a worse language anyway as there are already perfectly good
 forms using the function keyword now.

Eight characters is at least six too many.


 We don't need new syntax and
 we don't need multiple ways to do the same thing just for the sake 6

Wrong, 14. You are not counting 'return'.


 characters. Please keep JavaScript simple.

Sorry, this is a bogus argument. Simple does not mean fewest productions in 
all possible grammars or fewest ways of saying any given sentence. That is 
simpler by some measures, more complex by others. In particular, writing and 
(lesser but still material) reading 'function' over and over is not a win.

Consider the destructuring object shorthand: let {x, y} = pt; instead of let 
{x:x, y:y} = pt;


 Look at all the complex/subtle edge cases mentioned in the wiki page
 about arrow function syntax. Do we really want to have that much
 trickiness added to the language?

The wiki page is a work in progress. I have updates coming, which should 
address the parenthesization burden. But again, you can use 14 characters if 
you want. This is shorthand, and only shorthand. And usability counts, so 
shorthands are in Harmony (e.g., destructuring)

Gzip is not the issue (although stats I've seen from Steve Souders show too may 
scripts not being compressed at the Transfer-encoding layer). Human usability 
is.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-06 Thread Peter Michaux
On Fri, May 6, 2011 at 6:39 PM, Brendan Eich bren...@mozilla.com wrote:

 But again, you can use 14 characters if you want.

The problem is that the author of the code that I'm reading may have
used the arrow syntax and then I'm stuck reading it.

 This is shorthand, and only shorthand. And usability counts, so shorthands 
 are in Harmony (e.g., destructuring)

Yes and readability counts. JavaScript's function syntax is already
*highly* usable and readable. Having many ways to write the same thing
is a burden to readers of code because they have to know a larger set
of forms and all of the gotchas that come along with them.

A lot of languages have a lot of cool syntax and then the
communities come up with best practices that prohibit the use of them
anyway often for reasons only discovered after their introduction. My
hunch is that arrow syntax will be one of these cases.

JavaScript can use attention in many of areas. Devoting time to adding
sugary function syntax seems like a misappropriation of resources.

Peter
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: arrow syntax unnecessary and the idea that function is too long

2011-05-06 Thread Andrew Dupont

On May 7, 2011, at 12:42 AM, Peter Michaux wrote:

 Yes and readability counts. JavaScript's function syntax is already
 *highly* usable and readable.

Many people, including me, would disagree. On matters of taste, I'd want the 
committee to listen to all interested parties and try to pick the solution that 
pleases the most people. That appears to be what's happening here.

Cheers,
Andrew
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss