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