Захватите аргументы вызова функции с помощью sweet.js

Я пытаюсь написать правило для захвата выражения и аргументов вызова функции с помощью sweet.js.

Вот мой текущий макрос (который не соответствует):

macro foo {
    rule {
        ( $fn:expr ($args ...) )
    } => {
        $fn("stuff", $args ...) // pushes "stuff" to the beginning of the arguments
    }
}

И некоторые входы и ожидаемые результаты:

foo(somefn("bar"))

должен вывести:

somefn("stuff", "bar")

а также

foo(console.log("bar"))

должен вывести:

console.log("stuff", "bar")

Будем очень благодарны любой помощи.

1 ответ

Решение

:expr класс шаблона жадный так $fn:expr соответствует всем somefn("bar") (так как это целое выражение).

В этом случае, вероятно, самое простое решение - использовать эллипсы:

macro foo {
    rule {
        ( $fn ... ($args ...) )
    } => {
        $fn ... ("stuff", $args ...) // pushes "stuff" to the beginning of the arguments
    }
}
Другие вопросы по тегам