Javascript Sweet.js-将令牌扩展为字符串
我想将令牌扩展为字符串。例如,我有一个宏:Javascript Sweet.js-将令牌扩展为字符串,javascript,macros,sweet.js,Javascript,Macros,Sweet.js,我想将令牌扩展为字符串。例如,我有一个宏: macro String { rule { $x } => { "$x" } } 我希望字符串1扩展到“1”,但它只扩展到1 我怎样才能做到这一点 编辑:使用声明式方法似乎不可能做到这一点,但使用命令式方法应该可以做到这一点(请参阅): 但这仍然会用引号扩展。如中所述,您可以使用命令式方法来完成,但这有点尴尬,而且没有很好的文档记录。基本上,你是这样做的: macro String { case {_ $x} =
macro String {
rule {
$x
} => {
"$x"
}
}
我希望字符串1
扩展到“1”
,但它只扩展到1代码>
我怎样才能做到这一点
编辑:使用声明式方法似乎不可能做到这一点,但使用命令式方法应该可以做到这一点(请参阅):
但这仍然会用引号扩展。如中所述,您可以使用命令式方法来完成,但这有点尴尬,而且没有很好的文档记录。基本上,你是这样做的:
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};
}
}
}
顺便说一句,我不会将这个宏称为“字符串”——它与JavaScript固有部分的现有字符串冲突 虽然您仍然需要使用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}
}
}
您是否尝试过toString()?@FelipeKM,它将在结果中展开toString()
。引号应该由宏添加。@jviotti我在Sweet.js的Github上发现了这个问题:似乎正是您想要的,但它被关闭了,没有提到如何实际操作。@toastymallos正是我要找的。在这篇评论中()disnet说不可能使用声明式方法,但可以使用命令式方法。这个问题已经存在了一年,而且已经采取了必要的办法。但是仍然无法用这种方法解决问题。@jviotti你和我,我已经试了一个小时了!如果今晚没有人回答,我将安装sweet.js,并尝试在家里的电脑上找到答案。我仍然只得到了4
,而不是“4”
。适用于非数字<代码>字符串!=“!”
,字符串something=something
。仍然有数字没有被引用。@jviotti:说得好。不过,我认为我们可以把它严格化。更新后,它似乎可以在Sweet.js编辑器中使用所有类型。
macro syntaxToStr {
rule {$x} => {
[makeValue(unwrapSyntax($x).toString(), $x)]
}
}
macro makeStr {
case {_ $x} => {
letstx $xStr = syntaxToStr(#{$x});
return #{$xStr}
}
}