Named Arrow Functions

Isiah Meadows isiahmeadows at gmail.com
Wed Aug 12 02:00:01 UTC 2015


And as Kevin said, it has been mentioned before (with event handlers and
timeouts as the initial driving force).

https://esdiscuss.org/topic/self-recursion-and-arrow-functions

On Tue, Aug 11, 2015, 21:57 Isiah Meadows <isiahmeadows at gmail.com> wrote:

> Sent this too early... Corrected inline.
>
> On Tue, Aug 11, 2015, 21:56 Isiah Meadows <isiahmeadows at gmail.com> wrote:
>
> The real reason people need named arrow functions, the biggest use case is
> for event handlers.
>
> ```js
> let p = new Promise((resolve, reject) =>
>   setTimeout((x => () => x(x))(handler => {
>     onNotNeeded(() => clearTimeout(handler));
>
>     // `return` is to take advantage of TCO
>     return doSomethingAsync(err => {
>       if (err != null) return reject(err)
>       else return resolve();
>     });
>   }));
> ```
>
> By the way, the way I created a self reference is a complete lambda
> calculus hack.
>
> <deviation>
> If you'd like your eyes to bleed, here's one that is purely out if
> lambdas. I couldn't help myself.
>
> ```js
> let p = new Promise((resolve, reject) =>
>   setTimeout((x => () => x(x))(h =>
>     x => y => y(x()))(
>       onNotNeeded(() => clearTimeout(h)))(
>       doSomethingAsync(e =>
>
>
> e
>
> != null
>
> ?
>
> reject(err)
>
> :
>
>   resolve()
>
> )))
>
> );
> ```
>
> On Tue, Aug 11, 2015, 20:45 Leonardo Wolter <leocwolter at gmail.com> wrote:
>
> Well, I found out arguments is actually a reserved word too haha
>
> About that:
>
>  If they're not from the tiny set of remaining reserved words
> (enum, anyone?), they can be users' identifiers, and have to be based
> contextually on some enclosing syntax, like yield is.
>
> That could be it, right? Since it would be only available at arrow
> functions(anon functions too?)
>
> 2015-08-11 21:42 GMT-03:00 Leonardo Wolter <leocwolter at gmail.com>:
>
> Yeah., that's what I meant.
>
> My proposal is not a keyword, but an hidden variable included at functions
> (e.g. arguments).
>
> Does arrow functions have any limitations about that?
>
> 2015-08-11 21:35 GMT-03:00 Daniel Ehrenberg <dehrenberg at chromium.org>:
>
> I assume you mean more like this (without factorial):
>
>  x.map((x) => do {
>         if (x <= 1) {
>             1;
>         } else {
>             x * recur(x - 1)
>         }
>     });
>
> One issue is that it's hard to add keywords to JavaScript at this
> point. If they're not from the tiny set of remaining reserved words
> (enum, anyone?), they can be users' identifiers, and have to be based
> contextually on some enclosing syntax, like yield is.
>
> Another downside is that then, arrow functions have a distinct and
> less powerful method of recursing (e.g., nested functions won't be
> able to see the binding to the outer one).
>
> Dan
>
> On Tue, Aug 11, 2015 at 5:30 PM, Leonardo Wolter <leocwolter at gmail.com>
> wrote:
> > What about a clojure like recur hidden variable binded to the
> bottom-level
> > function?
> >
> >  x.map(factorial(x) => do {
> >         if (x <= 1) {
> >             1;
> >         } else {
> >             x * recur(x - 1)
> >         }
> >     });
> >
> > 2015-08-11 21:26 GMT-03:00 Daniel Ehrenberg <dehrenberg at chromium.org>:
> >>
> >> In addition to being hard to parse in general, I don't think this
> >> would play very well with the async/await proposal
> >> https://tc39.github.io/ecmascript-asyncawait/ , which wants to have
> >> arrow functions like
> >>
> >> async (x) => ...
> >>
> >> Because we can't count on async as a keyword, your proposal would
> >> create an ambiguity.
> >>
> >> On Tue, Aug 11, 2015 at 1:49 PM, Jacob Parker <
> jacobparker1992 at gmail.com>
> >> wrote:
> >> > I did look, but couldn’t find anything on named arrow functions were
> not
> >> > included. I do sometimes find cases where I want recursion inside a
> class
> >> > function definition, and still need access to `this`. Was it just
> seen as
> >> > syntax bloat, or were there any complications to implementing it?
> >> >
> >> > Obviously a contrived example, but something like this (using do
> syntax
> >> > too)
> >> >
> >> >     x.map(factorial(x) => do {
> >> >         if (x <= 1) {
> >> >             1;
> >> >         } else {
> >> >             x * factorial(x - 1)
> >> >         }
> >> >     });
> >> >
> >> > _______________________________________________
> >> > es-discuss mailing list
> >> > es-discuss at mozilla.org
> >> > https://mail.mozilla.org/listinfo/es-discuss
> >> _______________________________________________
> >> es-discuss mailing list
> >> es-discuss at mozilla.org
> >> https://mail.mozilla.org/listinfo/es-discuss
> >
> >
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150812/f52d5c68/attachment.html>


More information about the es-discuss mailing list