Sweet.js выражение для строкового литерала
Я пытаюсь написать макрос, который будет преобразовывать токены в строки. Мой текущий макрос выглядит так:
macro stringify {
case {
$name($token)
} => {
letstx $tokenStr = [makeValue(unwrapSyntax(#{$token}), #{here})];
return #{
$tokenStr
}
}
case {
$name($token $rest ... )
} => {
return #{
stringify($token) , stringify($rest ...)
}
}
}
Это хорошо работает для преобразования идентификаторов в строки, но не может превратить литералы или выражения в строки. Вот мой тестовый пример и во что он входит:
stringify(a b 7 d e foo 5+9)
компилируется в:
'a', 'b', 7, 'd', 'e', 'foo', 5, '+', 9;
Я хотел бы, чтобы это скомпилировать в:
'a', 'b', '7', 'd', 'e', 'foo', '5+9';
Я предполагал, что смогу сделать это, используя expr
шаблон класса, но когда я это делаю, я получаю эту ошибку:
/usr/local/lib/node_modules/sweet.js/lib/sweet.js:99
throw new SyntaxError(syn.printSyntaxError(source$2, err))
^
SyntaxError: [makeValue] Cannot make value syntax object from: [object Object]
at expand$2 (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:99:27)
at parse (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:135:29)
at Object.compile (/usr/local/lib/node_modules/sweet.js/lib/sweet.js:143:19)
at Object.exports.run (/usr/local/lib/node_modules/sweet.js/lib/sjs.js:70:45)
at Object.<anonymous> (/usr/local/lib/node_modules/sweet.js/bin/sjs:7:23)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10
Который, кажется, вызван makeValue
функция не может обработать выражение.
Если бы кто-нибудь мог дать мне некоторое представление, я был бы очень признателен.
2 ответа
Так expr
s будет массивом токенов, которые вам нужно отобразить. Простой пример:
macro str_expr {
case {
_ ($toks:expr)
} => {
var toks = #{$toks};
var toks_str = toks.map(function(tok) { return unwrapSyntax(tok); }).join("");
letstx $tok_str = [makeValue(toks_str, #{here})];
return #{
$tok_str
}
}
}
str_expr (2 + 4)
// expands to '2+4'
Вам просто нужно обработать нормальный случай токена и :expr
чехлы индивидуально.
Это модифицированная версия ответа Тимдиней.
macro str_expr {
case {
_ ($toks:expr)
} => {
var toks = #{$toks};
var toks_str = unwrapSyntax(toks[0]).inner.map(function(tok) {
return unwrapSyntax(tok);
}).join("");
letstx $tok_str = [makeValue(toks_str, #{here})];
return #{
$tok_str
}
}
}
console.log(str_expr (2+ 4+7 - 9 + a));
// expands into "2+3+7-9+a"