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