Валидные декораторы с точки зрения синтаксиса JS для функций (в ES7 декораторы можно вешать только на классы, методы класса и литерала объекта).
macro func {
rule { $arg => $body:expr }
rule { $arg => { $body ... } }
rule { ($args (,) ...) => $body:expr }
rule { ($args (,) ...) => { $body ... } }
rule { function ($args (,) ...) { $body ... } }
rule { function $name:ident ($args (,) ...) { $body ... } }
}
macro decorate {
rule { $f:expr @ ($decorator) } => {
$decorator($f)
}
rule { $f:func @ ($head $tail ...) } => {
decorate $head($f) @ ($tail ...)
}
rule { ($decorators:expr (,) ...) :: $f:func } => {
decorate $f @ ($decorators ...)
}
}
function wrapper(cb) {
return function () {
alert(1);
return cb.apply(this, arguments);
};
}
let foo = decorate(wrapper) :: function (a, b) {
return a + b;
};