Sweet.js 宏参数扩展到正文中的另一个宏,这是不需要的
Sweet.js macro argument expand to another macro in body, which is not wanted
我正在尝试编写一个漂亮的宏,但遇到了一些麻烦。
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)
我该如何解决这个问题?谢谢
问题可以在这里找到:
$(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)) (,) ...
}
}
我正在尝试编写一个漂亮的宏,但遇到了一些麻烦。
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)
我该如何解决这个问题?谢谢
问题可以在这里找到:
$(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)) (,) ...
}
}