aboutsummaryrefslogtreecommitdiff
path: root/lib/metaprogramming.nom
diff options
context:
space:
mode:
Diffstat (limited to 'lib/metaprogramming.nom')
-rw-r--r--lib/metaprogramming.nom41
1 files changed, 24 insertions, 17 deletions
diff --git a/lib/metaprogramming.nom b/lib/metaprogramming.nom
index 0d5e575..d1236fe 100644
--- a/lib/metaprogramming.nom
+++ b/lib/metaprogramming.nom
@@ -9,13 +9,16 @@ lua> ".."
| local body = nomsu:typecheck(vars, "body", "Thunk");
| return ([[
|nomsu:def(%s, %s, %s)
- |]]):format(nomsu:repr(signature), nomsu:tree_to_lua(body), nomsu:repr(("rule %s\\n..=%s"):format(vars.signature.src, vars.body.src))), nil;
+ |]]):format(nomsu:repr(signature), nomsu:tree_to_lua(body), nomsu:repr(\(__src__))), nil;
|end));
# Rule to make nomsu macros:
-rule [escaped parse %shorthand as %longhand] =:
+rule [parse \%shorthand as \%longhand] =:
lua> ".."
- |local aliases = nomsu:get_stubs(nomsu:typecheck(vars, "shorthand", "List").value);
+ |local signature = {};
+ |for i, alias in ipairs(nomsu:typecheck(vars, "shorthand", "List").value) do
+ | signature[i] = alias.src;
+ |end
|local template = nomsu:typecheck(vars, "longhand", "Thunk").value;
|local function parsing_as(nomsu, vars)
# Single expression/statement
@@ -33,36 +36,36 @@ rule [escaped parse %shorthand as %longhand] =:
| end
| return nil, table.concat(lua_bits, "\\n");
|end
- |nomsu:defmacro(aliases, parsing_as, ("parse %s\\n..as %s"):format(vars.shorthand.src, vars.longhand.src));
-escaped parse \[parse %shorthand as %longhand] as \: escaped parse \%shorthand as \%longhand
+ |nomsu:defmacro(signature, parsing_as, \(__src__));
# Rule to make lua macros:
-rule [escaped compile %macro_def to %body] =:
+rule [compile \%macro_def to \%body] =:
lua> ".."
- |local aliases = nomsu:get_stubs(nomsu:typecheck(vars, "macro_def", "List").value);
+ |local signature = {};
+ |for i, alias in ipairs(nomsu:typecheck(vars, "macro_def", "List").value) do
+ | signature[i] = alias.src;
+ |end
|local body = nomsu:typecheck(vars, "body", "Thunk");
|local thunk = nomsu:tree_to_value(body);
- |nomsu:defmacro(aliases, thunk, ("compile %s\\n..to %s"):format(vars.macro_def.src, body.src));
-rule [escaped compile %macro_def to code %body] =:
+ |nomsu:defmacro(signature, thunk, ("compile %s\\n..to %s"):format(vars.macro_def.src, body.src));
+rule [compile \%macro_def to code \%body] =:
lua> ".."
- |local aliases = nomsu:get_stubs(nomsu:typecheck(vars, "macro_def", "List").value);
+ |local signature = {};
+ |for i, alias in ipairs(nomsu:typecheck(vars, "macro_def", "List").value) do
+ | signature[i] = alias.src;
+ |end
|local body = nomsu:typecheck(vars, "body", "Thunk");
|local thunk = nomsu:tree_to_value(body);
|local thunk_wrapper = function(nomsu, vars) return nil, thunk(nomsu, vars); end
- |nomsu:defmacro(aliases, thunk_wrapper, ("compile %s\\n..to code %s"):format(vars.macro_def.src, body.src));
-parse [compile %macro_def to %body] as: escaped compile \%macro_def to \%body
-parse [compile %macro_def to code %body] as: escaped compile \%macro_def to code \%body
+ |nomsu:defmacro(signature, thunk_wrapper, ("compile %s\\n..to code %s"):format(vars.macro_def.src, body.src));
rule [remove rule %stub] =:
lua> ".."
|local def = nomsu.defs[\(%stub)];
|for _, alias in ipairs(def.aliases) do
- | nomsu.defs[alias] = nil;
+ | nomsu.defs[alias] = false;
|end
-rule [do %] =:
- =lua "\(%)(nomsu, vars)"
-
rule [%tree as lua] =:
=lua "nomsu:tree_to_lua(\(%tree))"
rule [%tree as value] =:
@@ -76,6 +79,7 @@ parse [lua do> %block] as:
lua> "do"
lua> %block
lua> "end"
+
rule [%tree as lua statement] =:
lua do> ".."
|local _,statement = nomsu:tree_to_lua(\(%tree));
@@ -95,6 +99,9 @@ compile [nomsu] to: "nomsu"
compile [nomsu's %key] to: "nomsu[\(%key as lua)]"
compile [nomsu %method %args] to: "nomsu[\(%method as lua)](nomsu, unpack(\(%args as lua)))"
+parse [rule %signature] as:
+ (nomsu's "defs")->(nomsu "get_stub" [\%signature])
+
# Get the source code for a function
rule [help %rule] =:
lua do> ".."