我试图编写一个sweet.js宏,它需要生成方法调用语法obj.method(),但是method作为文字表达式传入宏。例如:
mcall(obj, toString().length);
// becomes
obj.toString().length;我有个很接近的东西:
macro mcall {
rule { ($o, $m:expr) } => { $o.$m }
}
mcall(obj, toString().length);然而,这显然扩展到以下方面:
obj . ( toString ( ) . length );这些额外的括号是从哪里来的,我如何摆脱它们?我应该使用案例规则和#{}吗?我尝试过这样做,但仍然无法在没有额外括号的情况下生成方法调用。
发布于 2014-06-14 00:14:57
因此,目前在sweet.js中,绑定到:expr模式变量的令牌被包装在parens中,以帮助获得优先级以正确工作。这是一种黑客攻击,很快就会被修复(这里有更多的讨论:https://github.com/mozilla/sweet.js/issues/314)。
您的示例的简单解决方案就是不要使用:expr,因为您并不真正需要它:
macro mcall {
rule { ($o, $m ...) } => { $o.$m ... }
}附带注意:在这里使用:expr在技术上是错误的,因为不允许.的RHS是不受限制的表达式(例如2+4匹配$m:expr,但obj.2+4是语法错误)。
https://stackoverflow.com/questions/24215126
复制相似问题