aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2017-09-28 18:25:50 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2017-09-28 18:25:50 -0700
commit723a4c38710e24ef82c2142d126e6cec48091494 (patch)
tree62337deba78a3eb844f446ebf77f2baca7757ffb
parentac25e20b9f94505175841d9a8da7253f8996926d (diff)
Fixed some of secrets' functionality by rewriting rule % = %
-rw-r--r--lib/metaprogramming.nom36
-rw-r--r--lib/secrets.nom3
2 files changed, 26 insertions, 13 deletions
diff --git a/lib/metaprogramming.nom b/lib/metaprogramming.nom
index 7c643a9..a12cfc6 100644
--- a/lib/metaprogramming.nom
+++ b/lib/metaprogramming.nom
@@ -4,22 +4,37 @@
# Rule to make rules:
lua code ".."
- |nomsu:def("escaped rule %rule_def = %body", function(nomsu, vars)
+ |nomsu:defmacro("rule %rule_def = %body", function(nomsu, vars)
| local aliases = nomsu:typecheck(vars, "rule_def", "Block").value
- | local body = nomsu:typecheck(vars, "body", "Block")
- | local thunk = nomsu:tree_to_value({type="Thunk", value={type="Statements", value=body.value, src=body.src}, src=body.src})
| local canonical = aliases[1]
- | nomsu:def(canonical, thunk, body.src)
- | local function rewriter(nomsu, vars)
- | return nomsu:tree_to_lua(nomsu:replaced_vars(canonical, vars))
+ | local body = nomsu:typecheck(vars, "body", "Block")
+ | local thunk = nomsu:tree_to_lua({type="Thunk", value={type="Statements", value=body.value, src=body.src}, src=body.src})
+ | local lua = ([[
+ |nomsu:def(%s, %s, %s)
+ |]]):format(nomsu:repr(canonical.src), thunk, nomsu:repr(body.src))
+ | if #aliases > 1 then
+ | lua = lua .. ([[
+ |do
+ | local aliased = %s
+ | local src = %s
+ | local function dealiaser(nomsu, vars)
+ | return nomsu:tree_to_lua(nomsu:replaced_vars(aliased, vars))
| end
- | for i=2,#aliases do
- | nomsu:defmacro(aliases[i], rewriter, body.src)
+ |]]):format(nomsu:repr(canonical), nomsu:repr(canonical.src))
+ | for i=2,#aliases do
+ | lua = lua .. ([[
+ | nomsu:defmacro(%s, dealiaser, %s)
+ |]]):format(nomsu:repr(aliases[i].src), nomsu:repr(canonical.src))
+ | end
+ | lua = lua .. [[
+ |end
+ |]]
| end
- |end)
+ | return nil, lua
+ |end, "<source can be found in lib/metaprogramming.nom>")
# Rule to make nomsu macros:
-escaped rule \(escaped parse %shorthand as %longhand) = \:
+rule (escaped parse %shorthand as %longhand) =:
lua code ".."
|local aliases = nomsu:typecheck(vars, "shorthand", "Block").value
|local template = nomsu:typecheck(vars, "longhand", "Block")
@@ -31,7 +46,6 @@ escaped rule \(escaped parse %shorthand as %longhand) = \:
| nomsu:defmacro(call, parsing_as, template.src)
|end
escaped parse \(parse %shorthand as %longhand) as \: escaped parse \%shorthand as \%longhand
-parse (rule %rule_def = %body) as: escaped rule \%rule_def = \%body
# Rule to make lua macros:
rule (escaped compile %macro_def to %body) =:
diff --git a/lib/secrets.nom b/lib/secrets.nom
index b6274ab..756f988 100644
--- a/lib/secrets.nom
+++ b/lib/secrets.nom
@@ -17,7 +17,6 @@ compile (secret %key = %new_value) to code:
|Wrong type, expected Var, but got: \(%key's "type")
"secrets[\(repr (%key's "value"))] = \(%new_value as lua)"
-enable debugging
with secrets:
secret %foo = 5
rule (plumb %) =:
@@ -26,5 +25,5 @@ with secrets:
secret %foo
say (frop)
-pumb 99
+plumb 99
say (frop)