Why stop at ES3?

Point is this literally saves you two parens in exchange for one @ and a
peculiar logical insertion after the = for the use cases discussed.

Let's please collectively remember and acknowledge that this exists in
Python because *they have no function literal syntax*. We do.

On Wednesday, 21 October 2015, Yongxu Ren <renyon...@gmail.com> wrote:

> I agree with Andrea, basically nothing after es3 is a "must have", if we
> apply the same argument.
>
> I see a lot possibilities of decorator, I think it would be great if it
> can be used on any lvalue, or even statements.
>
> some of the application I can think of:
> ```
> //static type checking
> @type(number,number,number)
> function f(a,b){
>         ....
> }
>
> @debug(unitTestForFunction)
> let f = (x) => .....
>
> @parallel
> for(.......){.......}
> ```
> I think the best part of decorator is it can be processed by compiler or
> polyfilled, so we can use them to instruct translator such as babel, to do
> extra checking during development and drop them in production. It can also
> be used by JET, if supported. Extra type checking, debugging can be ignored
> by native engine, polyfilled to function that does nothing(as fallback if
> no native support), or optimized as static typed function for performance.
>
> I'd love to see a limitless decorator that also allows browser/compiler to
> receive hints from developers.
>
> On Wed, Oct 21, 2015 at 7:12 AM, Andrea Giammarchi <
> andrea.giammar...@gmail.com
> <javascript:_e(%7B%7D,'cvml','andrea.giammar...@gmail.com');>> wrote:
>
>> I agree it's not a "must have", considering what we lose if applied
>> (portability) + you are back to broken portability with @meomize function
>> ... VS meomize(function)
>>
>> So, I think portability is more important than some edge case without
>> parenthesis around and if really wanted as a pattern,there is a workaround.
>>
>> Create an object to unpack it ... why not ... named functions? why not
>> ... I'm used to write `{method:  function method() {}}` for debugging sake
>> and I like named functions but going even more dirty with the workaround
>> maybe an array to unpack would  make it less maintainable but less verbose
>> too.
>>
>> It will still be portable,  which is all it matters to me.
>>
>> Regards
>>
>>
>>
>>
>>
>> On Wed, Oct 21, 2015 at 1:01 PM, Alexander Jones <a...@weej.com
>> <javascript:_e(%7B%7D,'cvml','a...@weej.com');>> wrote:
>>
>>> 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
>>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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