Skip to content

[Feature request] Decorators / attributes #199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
SkyyySi opened this issue Mar 23, 2025 · 0 comments
Open

[Feature request] Decorators / attributes #199

SkyyySi opened this issue Mar 23, 2025 · 0 comments

Comments

@SkyyySi
Copy link

SkyyySi commented Mar 23, 2025

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant