Ups, I answered only to Jacob but I think this is a real simple solution:

    var factorial;
    x.map(factorial = x =>  x < 1 ? 1 : x * factorial(x-1));

Or simply:

    var factorial = x =>  x < 1 ? 1 : x * factorial(x-1);
    x.map(factorial);

As you said, this is ocassionally needed. And for event handlers:

    var once = evt => { button.onclick = null; onClick(evt) };
    button.onclick = once;

And yes, this solution was already provided:
https://esdiscuss.org/topic/self-recursion-and-arrow-functions#content-10

On Wed, Aug 12, 2015 at 4:00 AM, Isiah Meadows <isiahmead...@gmail.com>
wrote:

> 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 <isiahmead...@gmail.com> wrote:
>
>> Sent this too early... Corrected inline.
>>
>> On Tue, Aug 11, 2015, 21:56 Isiah Meadows <isiahmead...@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 <leocwol...@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 <leocwol...@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 <dehrenb...@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 <leocwol...@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 <dehrenb...@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 <
>> jacobparker1...@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@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
>>
>>
>>
> _______________________________________________
> 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

Reply via email to