Although this works, it seems like a bit of a violation of
say-what-you-mean and dont-repeat-yourself to me. You have to write the
name of each function twice, and you are defining a shorthand object
literal just for the sake of unpacking it.

If we must have syntax for this, I'd propose hijacking @ to mean general
paren-free invocation, using the same precedence rules as Coffee:

```js
const fibonacci = memoize(function(n) {...});
const fibonacci = @memoize function(n) {...};
const fib100 = @fibonacci 100;
@window.alert "If this syntax works for functions, why not let it work for
anything?";
```

But I must ask - why *exactly* do people have a problem with the extra
brackets again? Is it really just because we don't have good paredit or
other tree-based editing for JS yet? (Or do we?)

On Wednesday, 21 October 2015, Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> Again, everything can be defined in a similar way, actually granting those
> function  cannot posibly be declared or redefined differently, being
> constants.
>
> ```js
>
> const {
>   assert,
>   log,
>   add
> } = {
>   @conditional(DEBUG)
>   assert(condition, message = "assertion failed.") {
>     if (!condition) throw new Error(message);
>   }
>
>   @conditional(TRACE)
>   log(message) {
>     return target => function () {
>        console.log(message);
>        return target.apply(this, arguments);
>     };
>   }
>
>   @metadata("design:paramtypes", () => [Number, Number])
>   @metadata("design:returntype", () => Number)
>   function add(a, b) {
>     return a + b;
>   }
>
> };
> ```
>
> Beside that, that gist is completely unreadable to my eyes, I guess it
> would take some time to be maintained as well if that was production code.
>
> The work around fixes all that, it keeps portability of the current
> proposal, and it ensure log will always be that log and nothing else in
> that very same scope +  strawberry on  top, less writing and always named
> functions.
>
> How cool is that?
>
> Best Regards
>
>
>
>
> On Tue, Oct 20, 2015 at 8:26 PM, Ron Buckton <ron.buck...@microsoft.com>
> wrote:
>
>> I can think of numerous examples of how decorators could apply to
>> functions, and I’ve added them to a gist
>> <https://gist.github.com/rbuckton/37e944f7986e6833949e> [1] for easier
>> consumption. It’s true that simple decorators for functions can work as
>> simply as function calls, but this becomes a bit unwieldy if you need to
>> compose multiple decorators on a single function.
>>
>>
>>
>> Consider a scenario combining decorators providing runtime type
>> information as an annotation with one that adds runtime type checking. With
>> decorators this might be:
>>
>>
>>
>> ```js
>>
>> @paramtypes(() => [Number, Number])
>>
>> @returntype(() => Number)
>>
>> @checked
>>
>> function add(x, y) { return x + y }
>>
>> ```
>>
>>
>>
>> If I just use function expressions, this is feasible if a bit awkward:
>>
>>
>>
>> ```js
>>
>> const add =
>>
>>     paramtypes(() => [Number, Number])(
>>
>>         returntype(() => Number)(
>>
>>             checked(
>>
>>                 function (x, y) { return x + y; })))
>>
>> ```
>>
>>
>>
>> It feels a bit developer-hostile to have to rebalance parentheses if you
>> want to add a decorator, and there are ASI hazards if you misplace an
>> opening paren. Also, you can no longer infer the function name “add” from
>> the const binding.
>>
>>
>>
>> Using `::` isn’t a great replacement either, as there are many hazards
>> such as:
>>
>>
>>
>> ```js
>>
>> // The following means “call `decorator` with `this` bound to the
>> function object”.
>>
>> // Also, it becomes impossible to infer the function name “a” from the
>> let binding.
>>
>> let a = function() { }::decorator(x)
>>
>>
>>
>> let b = function() { }
>>
>> ::some.decorator(x) // ASI hazard as `::` can be either prefix or infix.
>>
>> ```
>>
>>
>>
>> One of the initial drivers for decorators was class methods, as there’s
>> no expression context immediately inside the class body in which you can
>> use either of the above scenarios. This necessitated a declarative form for
>> decorators to allow these scenarios to exist. Having parity across class
>> methods, classes, and functions (of all kinds) presents a more consistent
>> story to developers. The upswing in decorator use in both TypeScript and
>> Babel has been very positive, with libraries like Angular leveraging
>> decorators heavily in their codebase. Since we introduced decorators into
>> TypeScript, we’ve had a fair bit of feedback requesting support for
>> function decorators.
>>
>>
>>
>> I do think function decorators should wait until the Class/Property
>> decorators proposal advances further along the standards track. Axel’s
>> initial concerns/questions around hoisting are valid and there isn’t a
>> clear consensus on the semantics for functions. That said, I’ve been mostly
>> in the camp of introducing TDZ for function declarations that have
>> decorators. Decorators are a new syntactic form and we have the opportunity
>> to communicate this caveat with the development community by the time the
>> feature lands. It seems easy enough to explain that:
>>
>>
>>
>> ```js
>>
>> @decorator
>>
>> function func() { }
>>
>> ```
>>
>>
>>
>> Is the equivalent of:
>>
>>
>>
>> ```js
>>
>> let func = @decorator function() { }
>>
>> ```
>>
>>
>>
>> Introducing TDZ allows to generally warn early as part of the static
>> semantics, so developers won’t fall into a well with respect to adding a
>> decorator to a function and not being able to quickly understand how that
>> change affects the behavior of their code.
>>
>>
>>
>> I’m not certain what the current plan of record is, but the best approach
>> may be:
>>
>>
>>
>> 1.       Advance and get consensus on the Class/Property decorators
>> proposal
>>
>> 2.       Draft a separate proposal for decorators on function
>> expressions, generator function expressions, and arrows
>>
>> 3.       Draft a separate proposal for decorators on function
>> declarations
>>
>>
>>
>> Steps 1 and 2 above shouldn’t be significantly difficult and don’t
>> necessarily introduce any major new semantics outside of the decorators
>> themselves. Step 3 covers a thornier issue as it not only introduces the
>> new semantics of decorators but also introduces side-effects due to
>> hoisting.
>>
>>
>>
>> Ron
>>
>>
>>
>> [1] https://gist.github.com/rbuckton/37e944f7986e6833949e
>>
>>
>>
>>
>>
>> *From:* es-discuss [mailto:es-discuss-boun...@mozilla.org] *On Behalf Of
>> *Andrea Giammarchi
>> *Sent:* Tuesday, October 20, 2015 3:34 AM
>> *To:* Axel Rauschmayer <rausc...@icloud.com>
>> *Cc:* es-discuss mailing list <es-discuss@mozilla.org>
>> *Subject:* Re: Decorators for functions
>>
>>
>>
>> You haven't provided a single use-case example, like how are you going to
>> decorate a function or why.
>>
>>
>>
>> IMO if implemented it will be incompatible with non ES6 code unable to
>> distinguish between classes and functions unless fully transpiled, making
>> decorators less portable.
>>
>>
>>
>> One thing I like about current state is that you can use decorators even
>> in ES5 browsers [1]
>>
>>
>>
>> Just my 2 cents, Regards
>>
>>
>>
>>
>>
>> [1] as shown in the second example of the universal mixin module
>> https://github.com/WebReflection/universal-mixin#universal-mixin-
>> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgithub.com%2fWebReflection%2funiversal-mixin%23universal-mixin-&data=01%7c01%7cron.buckton%40microsoft.com%7c50c27148ba3543c448f608d2d939f7c4%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=T1q%2bKVVIyc%2bNxSyG9Ri%2bmNAMPqq3p6Ydofoe1WQrg5U%3d>
>>
>>
>>
>>
>> On Tue, Oct 20, 2015 at 10:30 AM, Axel Rauschmayer <rausc...@icloud.com>
>> wrote:
>>
>> https://github.com/wycats/javascript-decorators/blob/master/README.md
>> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgithub.com%2fwycats%2fjavascript-decorators%2fblob%2fmaster%2fREADME.md&data=01%7c01%7cron.buckton%40microsoft.com%7c50c27148ba3543c448f608d2d939f7c4%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=2fTFCt8Rrkx6pTvFLkcl8xfV5EKny35QpLPVTmm0aV8%3d>
>>
>> The decorator proposal does not include decorators for functions, because
>> it isn’t clear how to make them work in the face of hoisting.
>>
>> However, it would be great to have them. I see two possible solutions:
>>
>> – A decorator on a function declaration prevents hoisting.
>>
>> – Enable decorators for function expressions, arrow functions and
>> generator function expressions.
>>
>> Does either one of those make sense?
>>
>> Axel
>>
>> --
>> Dr. Axel Rauschmayer
>> a...@rauschma.de
>> rauschma.de
>> <https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2frauschma.de&data=01%7c01%7cron.buckton%40microsoft.com%7c50c27148ba3543c448f608d2d939f7c4%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=Vclw%2fyI29j4WqkHWjTgaZtoL12pnJNCWYBJK4wTYVA0%3d>
>>
>>
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fmail.mozilla.org%2flistinfo%2fes-discuss&data=01%7c01%7cron.buckton%40microsoft.com%7c50c27148ba3543c448f608d2d939f7c4%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=7t2BTGHrR322y2keuKyyEhgwUSIOCCN3vzv9CbXzdn8%3d>
>>
>>
>>
>
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to