Sweet.js - 将标记扩展为字符串

时间:2014-01-09 16:15:36

标签: javascript macros sweet.js

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

macro String {
  rule {
    $x
  } => {
    "$x"
  }
}

我希望String 1扩展为"1",但会扩展为1;

我该如何做到这一点?

编辑:这似乎不可能采用声明式方法,但应该采用强制方法(参见this comment):

macro String {
  case {_ $x } => {        
    return #{"$x"}
  }
}

但这仍然会随着报价而扩大。

2 个答案:

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