首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使sweet.js宏“m”扩展到符号“m”?

是否可以使sweet.js宏“m”扩展到符号“m”?
EN

Stack Overflow用户
提问于 2014-10-30 14:32:25
回答 1查看 95关注 0票数 0

假设有一个名为m的函数,调用如下所示

代码语言:javascript
复制
//foo.js
m("foo")

我有一个sweet.js宏,它定义了一个名为m的宏,用于接受foo.js并展开m (基本上是在编译时运行该函数)。

在某些情况下,我不想扩展m,因为与宏不同,函数可以作为头等公民传递。

代码语言:javascript
复制
doSomething(m) //don't want to expand this as a macro

如果在宏中没有覆盖此场景的情况,sweet.js会抱怨说,所以我需要一个可以扩展到相同符号的所有捕获规则。

代码语言:javascript
复制
macro m {
  //simplification to demonstrate a case that recursively expand macro
  case { _ ( $foo, $bar) } => { return #{m($foo)} }
  //does syntax unwrapping in real case
  case { _ ( $foo ) } => { return #{$foo} }

  //**this tries to recursively expand `m`, which is not what I want**
  case { _ } => { return #{m} } 
}

如何使m宏扩展到m函数,考虑到宏的其他情况确实需要将m作为宏递归展开?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 22:23:13

您需要let绑定宏:

代码语言:javascript
复制
let m = macro {
  case { _ ( $foo, $bar) } => { return #{$foo} }
  case { _ ( $foo ) } => { return #{$foo} }

  // `m` is bound to the surrounding scope, not the macro
  case { _ } => { return #{m} }
}

编辑:

对不起,你的问题第一次没有看完:)

这里有一个更好的解决方案,您只需要将它分成两个不同的宏,一个可以执行实际的递归工作,另一个可以处理非递归的基本情况:

代码语言:javascript
复制
function m() {}
macro m_impl {
  case { _ ( $foo, $bar) } => { return #{m_impl($foo)} }
  case { _ ( $foo ) } => { return #{$foo} }
}

let m = macro {
  case { _ ($foo, $bar) } => { return #{m_impl($foo, $bar)} } 
  case { _ } => { return #{m} } 
}

m (100, 200);
doSomething(m)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26655750

复制
相关文章

相似问题

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