diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/control_flow.nom | 129 | ||||
| -rw-r--r-- | core/math.nom | 8 | ||||
| -rw-r--r-- | core/metaprogramming.nom | 18 | ||||
| -rw-r--r-- | core/operators.nom | 8 |
4 files changed, 91 insertions, 72 deletions
diff --git a/core/control_flow.nom b/core/control_flow.nom index 4254abc..243df96 100644 --- a/core/control_flow.nom +++ b/core/control_flow.nom @@ -16,11 +16,13 @@ compile [do nothing] to (Lua "") test: if (no): barf "conditional fail" -compile [if %condition %if_body] to (..) - Lua "\ - ..if \(%condition as lua expr) then - \(%if_body as lua statements) - end" +compile [if %condition %if_body] to: + %lua = (Lua "if ") + %lua::append (%condition as lua expr) + %lua::append " then\n " + %lua::append (%if_body as lua statements) + %lua::append "\nend" + return %lua test: unless (yes): @@ -28,13 +30,15 @@ test: parse [unless %condition %unless_body] as (if (not %condition) %unless_body) compile [..] if %condition %if_body else %else_body, unless %condition %else_body else %if_body -..to (..) - Lua "\ - ..if \(%condition as lua expr) then - \(%if_body as lua statements) - else - \(%else_body as lua statements) - end" +..to: + %lua = (Lua "if ") + %lua::append (%condition as lua expr) + %lua::append " then\n " + %lua::append (%if_body as lua statements) + %lua::append "\nelse\n " + %lua::append (%else_body as lua statements) + %lua::append "\nend" + return %lua ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -149,9 +153,8 @@ test: compile [repeat %n times %body] to: define mangler %lua = (..) - Lua "\ - ..for \(mangle "i")=1,\(%n as lua expr) do - \(%body as lua statements)" + Lua "for \(mangle "i")=1,\(%n as lua expr) do\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" @@ -208,18 +211,20 @@ compile [..] ..to: # This uses Lua's approach of only allowing loop-scoped variables in a loop unless (%var.type is "Var"): - compile error at %var "Expected a variable here, not a \(%var.type)." + compile error at %var "Expected a variable here, not a \(%var.type)" %lua = (..) Lua "\ ..for \(%var as lua expr)=\(%start as lua expr),\(%stop as lua expr),\(..) %step as lua expr - .. do - \(%body as lua statements)" + .. do" + %lua::append "\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" if (%body has subtree \(do next %var)): - %lua::append "\n \(compile as (===next %var ===))" + %lua::append "\n " + %lua::append (compile as (===next %var ===)) %lua::append "\nend --numeric for-loop" if (%body has subtree \(stop %var)): %inner_lua = %lua @@ -254,14 +259,14 @@ compile [for %var in %iterable %body] to: define mangler # This uses Lua's approach of only allowing loop-scoped variables in a loop %lua = (..) - Lua "\ - ..for \(mangle "i"),\(%var as lua identifier) in ipairs(\(%iterable as lua expr)) do - \(%body as lua statements)" + Lua "for \(mangle "i"),\(%var as lua identifier) in ipairs(\(%iterable as lua expr)) do\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" if (%body has subtree \(do next %var)): - %lua::append (Lua "\n\(compile as (===next %var ===))") + %lua::append "\n " + %lua::append (compile as (===next %var ===)) %lua::append "\nend --foreach-loop" if (%body has subtree \(stop %var)): %inner_lua = %lua @@ -277,14 +282,14 @@ compile [for %var in %iterable %body] to: compile [for %var in %iterable at %i %body] to: # This uses Lua's approach of only allowing loop-scoped variables in a loop %lua = (..) - Lua "\ - ..for \(%i as lua identifier),\(%var as lua identifier) in ipairs(\(%iterable as lua expr)) do - \(%body as lua statements)" + Lua "for \(%i as lua identifier),\(%var as lua identifier) in ipairs(\(%iterable as lua expr)) do\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" if (%body has subtree \(do next %var)): - %lua::append (Lua "\n\(compile as (===next %var ===))") + %lua::append "\n " + %lua::append (compile as (===next %var ===)) %lua::append "\nend --foreach-loop" if (%body has subtree \(stop %var)): %inner_lua = %lua @@ -312,28 +317,33 @@ compile [..] ..to: # This uses Lua's approach of only allowing loop-scoped variables in a loop unless (%key.type is "Var"): - compile error at %key "Expected a variable here, not a \(%key.type)." + compile error at %key "Expected a variable here, not a \(%key.type)" unless (%value.type is "Var"): - compile error at %value "Expected a variable here, not a \(%value.type)." + compile error at %value "Expected a variable here, not a \(%value.type)" %lua = (..) Lua "\ ..for \(%key as lua identifier),\(%value as lua identifier) in pairs(\(..) %iterable as lua expr - ..) do - \(%body as lua statements)" + ..) do" + %lua::append "\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" if (%body has subtree \(do next %key)): - %lua::append (Lua "\n\(compile as (===next %key ===))") + %lua::append "\n " + %lua::append (compile as (===next %key ===)) if (%body has subtree \(do next %value)): - %lua::append (Lua "\n\(compile as (===next %value ===))") + %lua::append "\n " + %lua::append (compile as (===next %value ===)) %lua::append "\nend --foreach-loop" %stop_labels = (Lua "") if (%body has subtree \(stop %key)): - %stop_labels::append "\n\(compile as (===stop %key ===))" + %stop_labels::append "\n" + %stop_labels::append (compile as (===stop %key ===)) if (%body has subtree \(stop %value)): - %stop_labels::append "\n\(compile as (===stop %value ===))" + %stop_labels::append "\n" + %stop_labels::append (compile as (===stop %value ===)) if ((size of "\%stop_labels") > 0): %inner_lua = %lua %lua = (Lua "do -- scope for stopping for % = % loop\n ") @@ -390,7 +400,8 @@ compile [if %body, when %body] to: %code::append (%action as lua statements) %else_allowed = (no) ..else: - %code::append "\%clause " + %code::append %clause + %code::append " " for %i in 1 to ((size of %line) - 1): if (%i > 1): %code::append " or " @@ -450,11 +461,13 @@ compile [if %branch_value is %body, when %branch_value is %body] to: %code::append (%action as lua statements) %else_allowed = (no) ..else: - %code::append "\%clause " + %code::append %clause + %code::append " " for %i in 1 to ((size of %line) - 1): if (%i > 1): %code::append " or " - %code::append "\(mangle "branch value") == \(%line.%i as lua expr)" + %code::append "\(mangle "branch value") == " + %code::append (%line.%i as lua expr) %code::append " then\n " %code::append (%action as lua statements) @@ -467,18 +480,19 @@ compile [if %branch_value is %body, when %branch_value is %body] to: %lua = (..) Lua "\ ..do --if % is... - local \(mangle "branch value") = \(%branch_value as lua expr)" + local \(mangle "branch value") = " + %lua::append (%branch_value as lua expr) %lua::append "\n " %lua::append %code %lua::append "\nend --if % is..." return %lua # Do/finally -compile [do %action] to (..) - Lua "\ - ..do - \(%action as lua statements) - end --do" +compile [do %action] to: + %lua = (Lua "do\n ") + %lua::append (%action as lua statements) + %lua::append "\nend -- do" + return %lua test: %d = {} @@ -492,18 +506,22 @@ test: assume (%d.x == "good") compile [do %action then always %final_action] to: define mangler - return (..) + %lua = (..) Lua "\ ..do local \(mangle "fell_through") = false - local \(mangle "ok"), \(mangle "ret") = pcall(function() - \(%action as lua statements) - \(mangle "fell_through") = true - end) - \(%final_action as lua statements) - if not \(mangle "ok") then error(ret, 0) end - if not \(mangle "fell_through") then return ret end - end" + local \(mangle "ok"), \(mangle "ret") = pcall(function()" + %lua::append "\n " + %lua::append (%action as lua statements) + %lua::append "\ + .. \(mangle "fell_through") = true + end)" + %lua::append "\n " + %lua::append (%final_action as lua statements) + %lua::append "\ + .. if not \(mangle "ok") then error(ret, 0) end + if not \(mangle "fell_through") then return ret end + end" test: assume ((result of (: return 99)) == 99) @@ -532,8 +550,9 @@ compile [for %var in recursive %structure %body] to (..) ..do local \(mangle "stack \(%var.1)") = _List{\(%structure as lua expr)} while #\(mangle "stack \(%var.1)") > 0 do - \(%var as lua expr) = table.remove(\(mangle "stack \(%var.1)"), 1) - \(%body as lua statements)" + \(%var as lua expr) = table.remove(\(mangle "stack \(%var.1)"), 1)" + %lua::append "\n " + %lua::append (%body as lua statements) if (%body has subtree \(do next)): %lua::append "\n ::continue::" diff --git a/core/math.nom b/core/math.nom index 5daa2d8..feb64cb 100644 --- a/core/math.nom +++ b/core/math.nom @@ -72,21 +72,21 @@ action [%n to the nearest %rounder] (..) compile [all of %items, all %items] to: unless (%items.type is "List"): return (Lua value "utils.all(\(%items as lua expr))") - %clauses = ((% as lua expr) for % in %items) + %clauses = (((% as lua expr)::as smext) for % in %items) return (Lua value "(\(%clauses::joined with " and "))") parse [not all of %items, not all %items] as (not (all of %items)) compile [any of %items, any %items] to: unless (%items.type is "List"): return (Lua value "utils.any(\(%items as lua expr))") - %clauses = ((% as lua expr) for % in %items) + %clauses = (((% as lua expr)::as smext) for % in %items) return (Lua value "(\(%clauses::joined with " or "))") parse [none of %items, none %items] as (not (any of %items)) compile [sum of %items, sum %items] to: unless (%items.type is "List"): return (Lua value "utils.sum(\(%items as lua expr))") - %clauses = ((% as lua expr) for % in %items) + %clauses = (((% as lua expr)::as smext) for % in %items) return (Lua value "(\(%clauses::joined with " + "))") parse [if all of %items %body, if all of %items then %body] as (..) @@ -118,7 +118,7 @@ parse [unless none of %items %body else %else, unless none of %items then %body compile [product of %items, product %items] to: unless (%items.type is "List"): return (Lua value "utils.product(\(%items as lua expr))") - %clauses = ((% as lua expr) for % in %items) + %clauses = (((% as lua expr)::as smext) for % in %items) return (Lua value "(\(%clauses::joined with " * "))") action [avg of %items, average of %items] (=lua "(utils.sum(\%items)/#\%items)") diff --git a/core/metaprogramming.nom b/core/metaprogramming.nom index 00151d5..6a457d9 100644 --- a/core/metaprogramming.nom +++ b/core/metaprogramming.nom @@ -23,7 +23,7 @@ lua> "\ ..COMPILE_ACTIONS["1 -> 2"] = function(nomsu, tree, \%args, \%body) local lua = LuaCode.Value(tree.source, "(function(") if AST.is_syntax_tree(\%args, "Action") then \%args = \%args:get_args() end - local lua_args = table.map(\%args, function(a) return AST.is_syntax_tree(a) and tostring(nomsu:compile(a)) or a end) + local lua_args = table.map(\%args, function(a) return AST.is_syntax_tree(a) and nomsu:compile(a):as_smext() or a end) lua:concat_append(lua_args, ", ") local body_lua = AST.is_syntax_tree(\%body) and nomsu:compile(\%body):as_statements("return ") or \%body body_lua:remove_free_vars(lua_args) @@ -64,14 +64,14 @@ test: assume (%tmp is (nil)) or barf "compile to is leaking variables" lua> "\ ..COMPILE_ACTIONS["compile 1 to 2"] = function(nomsu, tree, \%actions, \%body) - local \%args = {"nomsu", "tree", unpack(table.map(\%actions[1]:get_args(), function(a) return tostring(nomsu:compile(\ - ..a)) end))} + local \%args = {"nomsu", "tree", unpack(table.map(\%actions[1]:get_args(), function(a) return nomsu:compile(\ + ..a):as_smext() end))} local lua = LuaCode(tree.source, "COMPILE_ACTIONS[", \%actions[1].stub:as_lua(), "] = ", \(compile as (%args -> %body))) for i=2,#\%actions do local alias = \%actions[i] - local \%alias_args = {"nomsu", "tree", unpack(table.map(alias:get_args(), function(a) return tostring(nomsu:compile(\ - ..a)) end))} + local \%alias_args = {"nomsu", "tree", unpack(table.map(alias:get_args(), function(a) return nomsu:compile(\ + ..a):as_smext() end))} lua:append("\\nCOMPILE_ACTIONS[", alias.stub:as_lua(), "] = ") if utils.equivalent(\%args, \%alias_args) then lua:append("COMPILE_ACTIONS[", \%actions[1].stub:as_lua(), "]") @@ -114,14 +114,14 @@ test: compile [local action %actions %body] to: lua> "\ ..local fn_name = \%actions[1].stub:as_lua_id() - local \%args = table.map(\%actions[1]:get_args(), function(a) return tostring(nomsu:compile(a)) end) + local \%args = table.map(\%actions[1]:get_args(), function(a) return nomsu:compile(a):as_smext() end) local lua = LuaCode(tree.source, fn_name, " = ", \(compile as (%args -> %body))) lua:add_free_vars({fn_name}) for i=2,#\%actions do local alias = \%actions[i] local alias_name = alias.stub:as_lua_id() lua:add_free_vars({alias_name}) - local \%alias_args = table.map(alias:get_args(), function(a) return tostring(nomsu:compile(a)) end) + local \%alias_args = table.map(alias:get_args(), function(a) return nomsu:compile(a):as_smext() end) lua:append("\\n", alias_name, " = ") if utils.equivalent(\%args, \%alias_args) then lua:append(fn_name) @@ -170,7 +170,7 @@ compile [parse %actions as %body] to (..) lua> "\ ..local replacements = {} for i,arg in ipairs(\%actions[1]:get_args()) do - replacements[arg[1]] = tostring(nomsu:compile(arg)) + replacements[arg[1]] = nomsu:compile(arg):as_smext() end local function make_tree(t) if AST.is_syntax_tree(t, "Var") then @@ -239,7 +239,7 @@ action [%var as lua identifier, %var as lua id] (..) elseif AST.is_syntax_tree(\%var, 'Var') then return \%var[1]:as_lua_id() elseif AST.is_syntax_tree(\%var) then local lua = \(%var as lua expr) - if not tostring(lua):match("^[_a-zA-Z][_a-zA-Z0-9]*$") then + if not lua:as_smext():match("^[_a-zA-Z][_a-zA-Z0-9]*$") then nomsu:compile_error(\%var, "This is not a valid Lua identifier.") end return lua diff --git a/core/operators.nom b/core/operators.nom index 3ae7c2f..960440e 100644 --- a/core/operators.nom +++ b/core/operators.nom @@ -34,7 +34,7 @@ compile [%var = %value] to: lua> "\ ..local lua = LuaCode(tree.source, \%var_lua, ' = ', \%value_lua, ';') if \%var.type == 'Var' then - lua:add_free_vars({tostring(nomsu:compile(\%var))}) + lua:add_free_vars({nomsu:compile(\%var):as_smext()}) end return lua" @@ -66,7 +66,7 @@ compile [set %assignments] to: %value as text ..) end if \%target.type == "Var" then - lhs:add_free_vars({tostring(target_lua)}) + lhs:add_free_vars({target_lua:as_smext()}) end if i > 1 then lhs:append(", ") @@ -107,7 +107,7 @@ test: compile [with external %externs %body] to: %body_lua = (%body as lua statements) lua> "\ - ..\%body_lua:remove_free_vars(table.map(\%externs, function(v) return tostring(nomsu:compile(v)) end))" + ..\%body_lua:remove_free_vars(table.map(\%externs, function(v) return nomsu:compile(v):as_smext() end))" return %body_lua test: @@ -141,7 +141,7 @@ compile [with %assignments %body] to: lhs:append(target_lua) rhs:append(value_lua) if \%target.type == "Var" then - vars[i] = tostring(target_lua) + vars[i] = target_lua:as_smext() end end \%lua:remove_free_vars(vars) |
