调用方法的Sweet.js宏

时间:2014-06-13 23:35:07

标签: javascript macros sweet.js

我正在尝试编写一个需要生成方法调用语法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 ); 吗?我尝试了这种排列,但仍然无法在没有额外括号的情况下生成方法调用。

1 个答案:

答案 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}}是语法错误。)