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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions