Hi people.

After reading the conversation, I think there is no ambiguity at all or,
may be, it must be there: decorating a function should be like decorating a
class, you can not distinguish between them and that's all. Just look at
the code generated in Babel:
https://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&code=%40decorator%0Aclass%20A%20{}

You'll see:

```
A = decorator(A) || A;
```

And this is the traditional notion of decorator we see in Python and other
languages. A simple way to check for a generic decorator would be:

```
function decorator(target, name='', descriptor=null) {
  if (descriptor) console.log('Decorating a member');
  else console.log('Decorating either a function or class');
}
```

And it's very consistent if you think the only difference a ES6 class
introduces is that you are not allowed to call the class as a function.

So, the generated code for:

```
@decorator
function A() { }
```

Should be:

```
function A() {}
A = decorator(A) || A;
```

And that's all, if you always add the overwrite after the definition,
hoisting is irrelevant but if it worries you, simply avoid hoisting when
decorating as Axel suggested.


PS: Well thought, it must be possible for an hypothetical reflection
function to determine if a function is a class or not as classes are marked
to throw when they are not invoked with new.

On Thu, Oct 22, 2015 at 9:52 PM, Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> Ron, there's **no way** you can distinguish a class from  a generic
> function in current specifications.
>
> Having one argument won't tell me much, having a way to know that is not a
> class I need to decorate (traits/mixins) but just a function, so ignoring
> its prototype and do something else, would be cool but it's unfortunately
> not possible or portable.
>
> How would you distinguish between a class or a function for a generic
> decorator? Or all you are saying is that decorators shouldn't be able to
> distinguish at all between a class, rather than a function?
>
> Regards
>
>
>
>
> On Thu, Oct 22, 2015 at 7:32 PM, Ron Buckton <ron.buck...@microsoft.com>
> wrote:
>
>> Andrea,
>>
>>
>>
>> Is your concern about disambiguating the usage of a decorator at the call
>> site or within the body of the decorator? In the current proposal, you can
>> decorate a class member, or the class itself.
>>
>>
>>
>> When decorating a class member, three arguments are passed to the
>> decorator: The target, the property key (string or symbol), and the
>> descriptor. When decorating the class, one argument is passed to the
>> decorator: The constructor function. Generally this means that you can
>> disambiguate the usage of the decorator based simply on `arguments.length`,
>> or testing for `undefined` for the property key or descriptor.
>>
>>
>>
>> Would it be better to have a more consistent way to disambiguate the
>> usage of a decorator from within the decorator? This could be addressed
>> with something like a Reflect.getDecoratorUsage API or a
>> `function.decoration` meta-property or the like. Consider something like:
>>
>>
>>
>> ```js
>>
>> function memoize(target, key, descriptor) {
>>
>>   switch (Reflect.getDecoratorUsage(arguments)) {
>>
>>     case "class":
>>
>>       // `target` is the class constructor. `key` and `descriptor` are
>> undefined.
>>
>>
>>
>>     case "function":
>>
>>       // `target` is the function. `key` and `descriptor` are undefined.
>>
>>
>>
>>     case "method":
>>
>>       // `target` is the object containing the method (e.g. constructor
>>
>>       // for a static method, prototype for a prototype method, or
>>
>>       // instance for an object literal method).
>>
>>       // `key` is the string or symbol property name for the method.
>>
>>       // `descriptor` is the property descriptor for the method.
>>
>>
>>
>>     case "accessor":
>>
>>       // `target` is the object containing the accessor (e.g. constructor
>>
>>       // for a static accessor, prototype for a prototype accessor, or
>>
>>       // instance for an object literal accessor).
>>
>>       // `key` is the string or symbol property name for the accessor.
>>
>>       // `descriptor` is the property descriptor for the accessor.
>>
>>   }
>>
>> }
>>
>> ```
>>
>>
>>
>> Ron
>>
>>
>>
>> *From:* es-discuss [mailto:es-discuss-boun...@mozilla.org] *On Behalf Of
>> *Andrea Giammarchi
>> *Sent:* Thursday, October 22, 2015 10:47 AM
>> *To:* Yongxu Ren <renyon...@gmail.com>
>> *Cc:* es-discuss mailing list <es-discuss@mozilla.org>
>> *Subject:* Re: Decorators for functions
>>
>>
>>
>> Removing ambiguity is my point since the very first post: current
>> proposal is about a target, a property name, and a descriptor for such
>> property ... having functions/variables decorators have no target (in
>> strict mode undefined can't be a target, right?) and not necessarily a
>> descriptor, or if any, always a data one with fields that makes no  sense
>> (like enumerable within a private scope ... what does that even mean)
>>
>>
>>
>> I'm all in for a distinct, separate, syntax to decorate "callables" or
>> other variables as long as the current proposal will make for ES7 and won't
>> be bothered by this different requirement.
>>
>>
>>
>> Regards
>>
>>
>>
>>
>>
>>
>>
>> On Thu, Oct 22, 2015 at 6:29 PM, Yongxu Ren <renyon...@gmail.com> wrote:
>>
>> I don't think
>>
>>
>>
>> > ```@@ or @() or @::meomize```
>>
>>
>>
>> would really help much, you can tell what the decorator does by simply
>> looking at its name. And looks like you can not use @ and @@ for the
>> same decorator function without adding extra condition checking inside the
>> function.
>>
>>
>>
>> There are two patterns that we have discussed here, they are actually
>> quite distinct. I still think we should support decorator on variables, but
>> maybe we should have 2 distinct syntax for the normal decorators and
>> "ambient decorators"(from Jonathan's post):
>>
>>
>>
>> 1.  decorator that alter the code behavior,  the currently proposed
>> decorator. Such as ```@memoize```
>>
>>
>>
>> 2. decorator that absolutely does not alter the code behavior, only used
>> for optimization, checking or debugging. Instead of @, a distinct syntax
>> will be much clearer ex.```@annotatition@``` (Maybe it should be called
>> annotation instead?):
>>
>> ```
>>
>> @deprecated@
>>
>>
>>
>> @number,number=>string@/*type checking*/
>>
>>
>>
>> @debug("this message will only print in development mode")@
>>
>> ```
>>
>>
>>
>> it sounds like terrible idea to have a decorator in code that you can not
>> figure out if it will alter the code behavior by looking at it. I do like
>> to see all the new ideas been added into javascript, but it is also
>> necessary to eliminate the ambiguity whenever possible.
>>
>>
>>
>>
>>
>> On Thu, Oct 22, 2015 at 11:20 AM, Jonathan Bond-Caron <
>> jbo...@gdesolutions.com> wrote:
>>
>> On Thu Oct 22 07:44 AM, Andreas Rossberg wrote:
>> > > determined at creation time, allowing for massive engine optimization,
>> >
>>
>> Ya I'm not sure from which hat "massive engine optimization" comes from?
>>
>> What's meant is likely using decorators as annotations (compile time
>> optimizations hints):
>> http://www.google.com/patents/US7013458
>> <https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fwww.google.com%2fpatents%2fUS7013458&data=01%7c01%7cron.buckton%40microsoft.com%7c4f28552d1837468197db08d2db08dcea%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=atTz2em0YIlXUvUVgiWsZ5xKNjJsIOzm3wLejdDl33E%3d>
>>
>> Or 'ambient decorators':
>>
>> https://github.com/jonathandturner/brainstorming/blob/master/README.md#c6-ambient-decorators
>> <https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgithub.com%2fjonathandturner%2fbrainstorming%2fblob%2fmaster%2fREADME.md%23c6-ambient-decorators&data=01%7c01%7cron.buckton%40microsoft.com%7c4f28552d1837468197db08d2db08dcea%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=1aXPAnWuPpVgE3wCYZqcEnTaksCKqzwuq0bGLkkG8Uo%3d>
>>
>> There's 2 patterns (maybe more?):
>> (a) Tagging a 'tree transformation'  on a node.
>> (b) Metadata at compile time on a node.
>>
>> The thing about (b) is it can easily live outside of the code (like in
>> typescript where you have an optional header/declaration file)
>>
>> With (a), it seems more conservative to see how it gets used with classes
>> before bolting on to functions (opinion: end result in java is not
>> something to be proud of).
>>
>>
>> _______________________________________________
>> 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%7c4f28552d1837468197db08d2db08dcea%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=YHeobU0gimD8xIX0FwR3GAdjKwWiwOGNGUWVi%2bHZARg%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%7c4f28552d1837468197db08d2db08dcea%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=YHeobU0gimD8xIX0FwR3GAdjKwWiwOGNGUWVi%2bHZARg%3d>
>>
>>
>>
>
>
> _______________________________________________
> 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