aboutsummaryrefslogtreecommitdiff
path: root/lib/scopes.nom
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2017-12-04 17:54:52 -0800
committerBruce Hill <bitbucket@bruce-hill.com>2017-12-04 17:54:52 -0800
commit5903820699db7f7ce2efdc0faa3874270da42a22 (patch)
tree6d8933dd68fdedbee9c87494e38dac97038e34ed /lib/scopes.nom
parentb3b8c4d731b0983d5b12c56fc245a8d7c1d631f4 (diff)
Incremental progress towards working.
Diffstat (limited to 'lib/scopes.nom')
-rw-r--r--lib/scopes.nom38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/scopes.nom b/lib/scopes.nom
new file mode 100644
index 0000000..362a8c5
--- /dev/null
+++ b/lib/scopes.nom
@@ -0,0 +1,38 @@
+require "lib/metaprogramming.nom"
+require "lib/operators.nom"
+require "lib/control_flow.nom"
+
+compile [<%var> = %value] to code: ".."
+ |nomsu.defs['#vars'][\(repr (%var's "value"))] = \(%value as lua);
+
+compile [<%var>] to: "nomsu.defs['#vars'][\(repr (%var's "value"))]"
+
+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
+
+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"])
+ ..do:
+ rule %signature = %body