使用sweet.js捕获函数调用的参数

时间:2014-07-23 17:31:24

标签: javascript macros 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 个答案:

答案 0 :(得分:2)

:expr模式类是贪婪的,因此$fn:expr匹配所有somefn("bar")(因为那是整个表达式)。

在这种情况下,最简单的解决方案可能是使用省略号:

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