我想将令牌扩展为字符串。例如,我有一个宏:
macro String {
rule {
$x
} => {
"$x"
}
}
我希望String 1
扩展到"1"
,但它只扩展到1;
我怎样才能做到这一点?
编辑:这似乎不可能与声明性方法有关,但应该与命令性方法有关(请参阅此评论):
macro String {
case {_ $x } => {
return #{"$x"}
}
}
但这仍然会随着引用而扩大。
正如本问题线程中所指出的,您可以使用命令式方法来实现这一点,但这有点尴尬,而且没有充分的文档。基本上,你是这样做的:
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本身的现有String冲突。
虽然您仍然需要使用case宏,但它可能比Chuck使用unwrapSyntax和letstx:的答案更简洁
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}
}
}