我想将令牌扩展为字符串。例如,我有这个宏:
macro String {
rule {
$x
} => {
"$x"
}
}
我希望String 1
扩展为"1"
,但会扩展为1;
我该如何做到这一点?
编辑:这似乎不可能采用声明式方法,但应该采用强制方法(参见this comment):
macro String {
case {_ $x } => {
return #{"$x"}
}
}
但这仍然会随着报价而扩大。
答案 0 :(得分:4)
正如this issue thread所述,你可以采用强制性的方法来做到这一点,但它有点尴尬而且没有很好的记录。基本上,你这样做:
macro String {
case {_ $x} => {
var pattern = #{$x};
var tokenString = pattern[0].token.value.toString();
var stringValue = makeValue(tokenString, #{$here});
return withSyntax($val = [stringValue]) {
return #{$val};
}
}
}
顺便说一句,我不会把这个宏称为“字符串” - 它与现有的String本身就是JavaScript的一部分冲突了。
答案 1 :(得分:3)
虽然你仍然需要使用case宏,但是使用unwrapSyntax和letstx可能比Chuck的答案更简洁:
macro makeStr1 {
case {_ $x} => {
var pattern = #{$x};
var asStr = unwrapSyntax(pattern).toString();
letstx $xStr = [makeValue(asStr, pattern)];
return #{$xStr};
}
}
但是,我们可以做得更好。宏中的宏怎么样?
macro syntaxToStr {
rule {$x} => {
[makeValue(unwrapSyntax($x).toString(), $x)]
}
}
macro makeStr {
case {_ $x} => {
letstx $xStr = syntaxToStr(#{$x});
return #{$xStr}
}
}