首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用方法的Sweet.js宏

调用方法的Sweet.js宏
EN

Stack Overflow用户
提问于 2014-06-13 23:35:07
回答 1查看 106关注 0票数 2

我试图编写一个sweet.js宏,它需要生成方法调用语法obj.method(),但是method作为文字表达式传入宏。例如:

代码语言:javascript
复制
mcall(obj, toString().length);
// becomes
obj.toString().length;

我有个很接近的东西:

代码语言:javascript
复制
macro mcall {
  rule { ($o, $m:expr) } => { $o.$m }
}

mcall(obj, toString().length);

然而,这显然扩展到以下方面:

代码语言:javascript
复制
obj . ( toString ( ) . length );

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-14 00:14:57

因此,目前在sweet.js中,绑定到:expr模式变量的令牌被包装在parens中,以帮助获得优先级以正确工作。这是一种黑客攻击,很快就会被修复(这里有更多的讨论:https://github.com/mozilla/sweet.js/issues/314)。

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

代码语言:javascript
复制
macro mcall {
  rule { ($o, $m ...) } => { $o.$m ... }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24215126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档