Skip to content

[Feature request] Decorators / attributes #199

@SkyyySi

Description

@SkyyySi

It would be nice if we could write something like this:

add_class_tostring = (target, name) ->
    target.<tostring> = () => "<class '#{name}'>"
    target


#[add_class_tostring]
class FooBar
    -- ...


print(FooBar) --> <class 'FooBar'>

It would be equivalent to this:

FooBar = add_class_tostring(class FooBar
    -- ...
"FooBar")

The name parameter would be statically determined from the declaration. This has the advantage that a statement like

#[wrap_func]
local x = () -> print("...")

would also have access to the name (x in this case). That would be equal to:

local x = wrap_func((() -> print("...")), "x")

Of course, name would have to be nil if the statement doesn't have a name (like a name-less class).


Additionally, macros should also be invocable as attributes:

macro example = (target, name) ->
    target


#[$example]
class FooBar
    -- ...

That would be equivalent to:

FooBar = $example(class FooBar
    -- ...
FooBar)

Note that, unlike a regular macro, the output of an attribute macro would not need to be wrapped in a do-expression.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions