我正在尝试编写一个需要生成方法调用语法sweet.js
的{{1}}宏,但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 );
吗?我尝试了这种排列,但仍然无法在没有额外括号的情况下生成方法调用。
答案 0 :(得分:2)
所以目前在绑定到:expr
模式变量的sweet.js标记中包含在parens中以帮助获得正常工作的优先级。这是一种黑客攻击,很快就会得到修复(这里有更多讨论:https://github.com/mozilla/sweet.js/issues/314)。
您的示例的简单解决方案是不使用:expr
,因为您并不真正需要它:
macro mcall {
rule { ($o, $m ...) } => { $o.$m ... }
}
附注:使用:expr
在技术上是错误的,因为.
的RHS不允许是不受限制的表达式(例如2+4
匹配$m:expr
但{{{}} 1}}是语法错误。)