2

我正在尝试编写一个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 );

这些额外的括号是从哪里来的,我该如何摆脱它们?我应该使用案例规则#{}吗?我尝试了它的排列,但仍然无法在没有额外括号的情况下成功生成方法调用。

4

1 回答 1

2

因此,目前在 sweet.js 中,绑定到:expr模式变量的标记被包裹在括号中,以帮助获得优先权以正常工作。这是一种 hack,很快就会得到修复(这里有更多讨论:https ://github.com/mozilla/sweet.js/issues/314 )。

您的示例的简单解决方案是不使用:expr,因为您并不真正需要它:

macro mcall {
  rule { ($o, $m ...) } => { $o.$m ... }
}

旁注::expr在这里使用在技术上是错误的,因为 a 的 RHS.不允许是不受限制的表达式(例如2+4匹配$m:expr但是obj.2+4语法错误)。

于 2014-06-14T00:14:57.877 回答