Sweet.js宏参数扩展到body中的另一个宏,这是不需要的

时间:2015-04-08 02:45:33

标签: sweet.js

我正在尝试写一个甜蜜的宏但有一些麻烦。

macro to_str {
  case { _ ($tok) } => {
    return [makeValue(unwrapSyntax(#{$tok}) + '=', #{ here })];
  }
}
macro foo {
    rule {($vars (,) ...) } => {
         $(to_str($vars) + $vars) (,) ...
    }
}

foo(a,b)应该扩展到

'a=' + a , 'b=' + b

它按预期工作。

但如果其中一个参数是另一个宏,则会出现一些错误。

E.g。有一个名为'bar'的宏,然后foo(a,bar)将导致以下错误:

SyntaxError: [macro] Macro `bar` could not be matched with `...`
80: foo(a, bar)

如何解决此问题?感谢

1 个答案:

答案 0 :(得分:2)

问题可以在这里找到:

$(to_str($vars) + $vars) (,) ...

您收到错误的原因是因为第二个$ vars被扩展。因此,当$ vars绑定到 bar 时,它会被扩展为宏,因为它被定义为这样。您可以做的是将其视为标识符,因此它不会像宏一样扩展:

macro to_str {
  case { _ ($tok) } => {
    return [makeValue(unwrapSyntax(#{ $tok }) + '=', #{ here })];
  }
}

macro to_ident {
  case { _ ($tok) } => {
    return [makeIdent(unwrapSyntax(#{ $tok }), null)];
  }
}

macro foo {
    rule {($vars (,) ...) } => {
         $(to_str($vars) + to_ident($vars)) (,) ...
    }
}