Sweet.js - Развернуть токен как строку

Я хочу расширить токен до строки. Например, у меня есть этот макрос:

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

Я бы ожидал String 1 расширить до "1"Однако он расширяется до всего 1;

Как я могу сделать это?

РЕДАКТИРОВАТЬ: Это кажется невозможным сделать с декларативным подходом, но должно быть возможно с императивным подходом (см. Этот комментарий):

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

Но это все еще расширяется с кавычками.

2 ответа

Решение

Как отмечалось в этой теме, вы можете сделать это с настоятельным подходом, но это немного неловко и плохо документировано. По сути, вы делаете это так:

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, он может быть более кратким, чем ответ Чака с использованием unwrapSyntax и lettx:

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}
  }
}
Другие вопросы по тегам