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.
It would be nice if we could write something like this:
It would be equivalent to this:
The name parameter would be statically determined from the declaration. This has the advantage that a statement like
would also have access to the name (
xin this case). That would be equal to:Of course,
namewould have to benilif the statement doesn't have a name (like a name-less class).Additionally, macros should also be invocable as attributes:
That would be equivalent to:
Note that, unlike a regular macro, the output of an attribute macro would not need to be wrapped in a
do-expression.