diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-01-07 18:03:37 -0800 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-01-07 18:03:37 -0800 |
| commit | c92e5fbc81e57ada43f2c17792e500da5b708bee (patch) | |
| tree | 8f89f2c0ab21de3fe6110c84ee980e0920d18fb4 /lib/scopes.nom | |
| parent | b1c6354464ab2c9f8f09217815a11317cc068cec (diff) | |
Some overhaul of binary operators so that arbitrary math patterns work
fine.
Diffstat (limited to 'lib/scopes.nom')
| -rw-r--r-- | lib/scopes.nom | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/lib/scopes.nom b/lib/scopes.nom index 29a543c..910b30e 100644 --- a/lib/scopes.nom +++ b/lib/scopes.nom @@ -1,6 +1,7 @@ require "lib/metaprogramming.nom" require "lib/operators.nom" require "lib/control_flow.nom" +require "lib/collections.nom" compile [<%var> = %value] to code: ".." nomsu.defs['#vars'][\(repr (%var's "value"))] = \(%value as lua); @@ -12,25 +13,30 @@ compile [str %] to: "tostring(\(% as lua))" compile [scope] to: "nomsu.defs" compile [parent scope] to: "getmetatable(nomsu.defs).__index" -parse [using %scoped do %actions] as: - %scope = (=lua "setmetatable({['#vars']=setmetatable({}, {__index=nomsu.defs['#vars']})}, {__index=nomsu.defs})") - with (nomsu's "defs") = %scope: - do %scoped - lua> ".." - getmetatable(nomsu.defs).__newindex = getmetatable(nomsu.defs).__index; - getmetatable(nomsu.defs["#vars"]).__newindex = getmetatable(nomsu.defs["#vars"]).__index; - do %actions +compile [using %scoped do %actions] to code: ".." + do + local old_scope, old_vars = nomsu.defs, vars; + local use_vars = setmetatable({}, {__index=old_scope['#vars']}); + local scope = setmetatable({['#vars']=use_vars}, {__index=old_scope}); + nomsu.defs = scope; + local ok, ret = pcall(function(nomsu, vars) + local ret; + do + \(%scoped as lua statements) + end + getmetatable(scope).__newindex = old_scope; + getmetatable(use_vars).__newindex = old_vars; + do + \(%actions as lua statements) + end + return ret; + end, nomsu, use_vars); + nomsu.defs = old_scope; + if not ok then nomsu:error(ret); end + end parse [scoped %actions] as: using %actions do (:pass) -rule [from %filename import %rules] =: - using: - require %filename - ..do: - %srcs = ((%'s "src") for %_ = % in (parent scope)) - for %src in (unique %srcs): - run %src - parse [wrap %signature with %body] as: using: run ((nomsu)->*["defs",nomsu "get_stub" [\%signature->*["value",1]],"src"]) |
