diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 533a666..a5b6666 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -6300,6 +6300,30 @@ private: | |||
| 6300 | auto res = "yue.is_ast("s + join(argStrs, ","sv) + ')'; | 6300 | auto res = "yue.is_ast("s + join(argStrs, ","sv) + ')'; |
| 6301 | lua_pushlstring(L, res.c_str(), res.size()); // cur res | 6301 | lua_pushlstring(L, res.c_str(), res.size()); // cur res |
| 6302 | return std::nullopt; | 6302 | return std::nullopt; |
| 6303 | } else if (macroName == "to_ast"sv) { | ||
| 6304 | if (!argStrs.empty() && args && !args->empty()) { | ||
| 6305 | if (!_parser.hasAST(argStrs.front())) { | ||
| 6306 | throw CompileError("invalid AST name"sv, args->front()); | ||
| 6307 | } else { | ||
| 6308 | argStrs.front() = '"' + argStrs.front() + '"'; | ||
| 6309 | if (argStrs.size() >= 2) { | ||
| 6310 | // name, code, level -> code, level, name | ||
| 6311 | auto name = argStrs.front(); | ||
| 6312 | argStrs.pop_front(); | ||
| 6313 | auto code = argStrs.front(); | ||
| 6314 | argStrs.pop_front(); | ||
| 6315 | if (argStrs.empty()) { | ||
| 6316 | argStrs.push_back("0"s); | ||
| 6317 | } | ||
| 6318 | argStrs.push_front(code); | ||
| 6319 | argStrs.push_back(name); | ||
| 6320 | } | ||
| 6321 | } | ||
| 6322 | } | ||
| 6323 | lua_pop(L, 1); // cur | ||
| 6324 | auto res = "yue.to_ast("s + join(argStrs, ","sv) + ')'; | ||
| 6325 | lua_pushlstring(L, res.c_str(), res.size()); // cur res | ||
| 6326 | return std::nullopt; | ||
| 6303 | } else { | 6327 | } else { |
| 6304 | throw CompileError("can not resolve macro"sv, x); | 6328 | throw CompileError("can not resolve macro"sv, x); |
| 6305 | } | 6329 | } |
