From 3b94999e55df35d19616e87d7f3b6fddf5b8a30b Mon Sep 17 00:00:00 2001 From: Li Jin Date: Wed, 26 Feb 2020 11:46:27 +0800 Subject: add fat arrow support for backcall statement. --- spec/inputs/backcall.moon | 13 +++++++++++++ src/MoonP/moon_ast.h | 7 ++++++- src/MoonP/moon_compiler.cpp | 5 +++-- src/MoonP/moon_parser.cpp | 3 ++- src/MoonP/moon_parser.h | 1 + src/moonp.cpp | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/spec/inputs/backcall.moon b/spec/inputs/backcall.moon index 3aedba9..2972b1d 100644 --- a/spec/inputs/backcall.moon +++ b/spec/inputs/backcall.moon @@ -90,4 +90,17 @@ do (data)<- loadAsync file addToCache file,data) |> reduce 0,(a,b)-> a+b +propA = do + (value)<= property => @_value + print "old value: #{@_value}" + print "new value: #{value}" + @_value = value + +propB = do + <= property _, (value)=> + print "old value: #{@_value}" + print "new value: #{value}" + @_value = value + @_value + alert "hi" diff --git a/src/MoonP/moon_ast.h b/src/MoonP/moon_ast.h index 917429e..dd01165 100644 --- a/src/MoonP/moon_ast.h +++ b/src/MoonP/moon_ast.h @@ -135,12 +135,17 @@ AST_NODE(Import) AST_END(Import) class FnArgsDef_t; + +AST_LEAF(fn_arrow_back) +AST_END(fn_arrow_back) + class ChainValue_t; AST_NODE(Backcall) ast_ptr argsDef; + ast_ptr arrow; ast_ptr value; - AST_MEMBER(Backcall, &argsDef, &value) + AST_MEMBER(Backcall, &argsDef, &arrow, &value) AST_END(Backcall) AST_NODE(ExpListLow) diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index a39bfd0..83b91e6 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp @@ -32,7 +32,7 @@ inline std::string s(std::string_view sv) { } const char* moonScriptVersion() { - return "0.5.0-r0.1.4"; + return "0.5.0-r0.1.5"; } class MoonCompilerImpl { @@ -1740,7 +1740,8 @@ private: body->content.set(block); auto funLit = x->new_ptr(); funLit->argsDef.set(backcall->argsDef); - funLit->arrow.set(toAst("->"sv, x)); + auto arrow = _parser.toString(backcall->arrow); + funLit->arrow.set(toAst(arrow == "<-"sv ? "->"sv : "=>"sv, x)); funLit->body.set(body); auto simpleValue = x->new_ptr(); simpleValue->value.set(funLit); diff --git a/src/MoonP/moon_parser.cpp b/src/MoonP/moon_parser.cpp index 1502f3c..fecf869 100644 --- a/src/MoonP/moon_parser.cpp +++ b/src/MoonP/moon_parser.cpp @@ -434,7 +434,8 @@ MoonParser::MoonParser() { NameOrDestructure = Space >> Variable | TableLit; AssignableNameList = Seperator >> NameOrDestructure >> *(sym(',') >> White >> NameOrDestructure); - Backcall = -FnArgsDef >> Space >> symx("<-") >> Space >> ChainValue; + fn_arrow_back = expr('<') >> set("-="); + Backcall = -FnArgsDef >> Space >> fn_arrow_back >> Space >> ChainValue; ExpList = Seperator >> Exp >> *(sym(',') >> White >> Exp); ExpListLow = Seperator >> Exp >> *((sym(',') | sym(';')) >> White >> Exp); diff --git a/src/MoonP/moon_parser.h b/src/MoonP/moon_parser.h index 215c6a4..12f735b 100644 --- a/src/MoonP/moon_parser.h +++ b/src/MoonP/moon_parser.h @@ -191,6 +191,7 @@ private: AST_RULE(ImportFrom) AST_RULE(ImportAs) AST_RULE(Import) + AST_RULE(fn_arrow_back) AST_RULE(Backcall) AST_RULE(ExpListLow) AST_RULE(ExpList) diff --git a/src/moonp.cpp b/src/moonp.cpp index 3f36d9d..ade1a1b 100644 --- a/src/moonp.cpp +++ b/src/moonp.cpp @@ -247,7 +247,7 @@ static int moontolua(lua_State* L) { } else { lua_pushlstring(L, err.c_str(), err.size()); } - if (globals && !globals->empty()) { + if (globals) { lua_createtable(L, static_cast(globals->size()), 0); int i = 1; for (const auto& var : *globals) { -- cgit v1.2.3-55-g6feb