Как стать автором
Обновить

Комментарии 5

Странно, что нету декораторов функций.
В декораторах есть смысл, когда они применяются к декларативно объявленным элементам. Обычную функцию можно «декорировать», просто объявив новую функцию и вызывая старую внутри нее. И никакого нового синтаксиса для этого не понадобится.
Как вы предлагаете переписать следующий код?
@input_contract( n => n >= 0 )
@log
@memoize
function fact( n ) {
    return n ? n * fact( n - 1 ) : n
}
Объявление функции в вашем примере — это выражение (expression), а не утверждение (statement). Возникает вопрос — а с анонимными функциями или другими выражениями типа «функция» как поступать? Придется либо усложнить грамматику и добавить два разных типа объявления функции, либо разрешить писать что-то вроде:

var myFunc = @a @b c;

Имхо, оба варианта слишком спорные, чтобы их реализовывать на практике.

Так что задачу правильнее всего решить по-старинке, реализовав некий helper, принимающий массив функций и компонующий их:

let fact = decorate(
    () => input_contract(n => n >= 0),
    log,
    memoize,
    function(n) {
        n ? n * fact( n - 1 ) : n
    }
);
Нет, у меня это именно statement. А вот если бы были декораторы для expressions — было бы вообще шоколадно в плане создания DSL.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий