鉴于此sweet.js宏
macro m {
case { _ ( $a, $b ) } => {
return #{$a + $b};
}
case { _ ( $a ) } => {
return #{$a};
}
case { _ } => {
return #{no};
}
}
export m;
这个源代码:
m(1, [m(2)]);
m(1, m(2));
如何创建一个产生此输出的案例:
1 + [2];
1 + 2;
而不是这个?
1 + [2];
no(1, 2);
P.S。实际用例需要大小写宏,而不是规则宏。
答案 0 :(得分:2)
你在这里遇到的基本问题是模式变量
只匹配一个令牌,因此m(1, m(2))
模式$b
得到
绑定到m
而不是m(2)
。这是因为内部m
宏没有
在外部m
宏运行之前进行扩展。
解决此问题的最简单方法是使用...
:
macro m {
case { _ ( $a ..., $b ...) } => {
return #{$a ... + $b ...};
}
case { _ ( $a ... ) } => {
return #{$a ...};
}
case { _ } => {
return #{no};
}
}