1

我正在尝试编写一个甜蜜的宏,但遇到了一些麻烦。

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

它按预期工作。

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

例如,有一个名为 'bar' 的宏,那么 foo(a, bar) 将导致以下错误:

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

我该如何解决这个问题?谢谢

4

1 回答 1

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)) (,) ...
    }
}
于 2015-04-08T03:50:23.683 回答