Sweet.js-将令牌扩展为字符串



我想将令牌扩展为字符串。例如,我有一个宏:

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}
}
}

最新更新