diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/control_flow.nom | 14 | ||||
| -rw-r--r-- | lib/metaprogramming.nom | 7 | ||||
| -rw-r--r-- | lib/operators.nom | 10 | ||||
| -rw-r--r-- | lib/permissions.nom | 17 | ||||
| -rw-r--r-- | lib/plurals.nom | 10 | ||||
| -rw-r--r-- | lib/secrets.nom | 11 |
6 files changed, 34 insertions, 35 deletions
diff --git a/lib/control_flow.nom b/lib/control_flow.nom index 4e13a8c..2ff764d 100644 --- a/lib/control_flow.nom +++ b/lib/control_flow.nom @@ -40,7 +40,7 @@ compile (continue %var; go to next %var; on to the next %var) to code: ".." # While loops compile (repeat while %condition %body) to block: ".." - |while \(%condition) do + |while \(%condition as lua) do | \(%body as lua statements) | ::continue_repeat:: |end @@ -87,8 +87,7 @@ parse (for all %iterable %body) as: for % in %iterable %body compile (when %body) to block: %result =: "" %fallthroughs =: [] - for %statement in (%body's "value"): - %func-call =: %statement's "value" + for %func-call in (%body's "value"): assert ((%func-call's "type") == "FunctionCall") ".." |Invalid format for 'when' statement. Only '*' blocks are allowed. %tokens =: %func-call's "value" @@ -103,7 +102,7 @@ compile (when %body) to block: %action =: %tokens -> 3 if (%action == (nil)): lua block "table.insert(vars.fallthroughs, vars.condition)" - go to next %statement + go to next %func-call if (lua expr "vars.condition.type == 'Word' and vars.condition.value == 'else'"): %result join=: ".." @@ -129,10 +128,9 @@ compile (when %body) to block: # Switch statement compile (when %branch-value == ? %body) to block: - %result =: "local branch_value = \(%branch-value)" + %result =: "local branch_value = \(%branch-value as lua)" %fallthroughs =: [] - for %statement in (%body's "value"): - %func-call =: %statement's "value" + for %func-call in (%body's "value"): assert ((%func-call's "type") == "FunctionCall") ".." |Invalid format for 'when' statement. Only '*' blocks are allowed. %tokens =: %func-call's "value" @@ -147,7 +145,7 @@ compile (when %branch-value == ? %body) to block: %action =: %tokens -> 3 if (%action == (nil)): lua block "table.insert(vars.fallthroughs, vars.condition)" - go to next %statement + go to next %func-call if (lua expr "vars.condition.type == 'Word' and vars.condition.value == 'else'"): %result join=: ".." diff --git a/lib/metaprogramming.nom b/lib/metaprogramming.nom index a12cfc6..4aa10e3 100644 --- a/lib/metaprogramming.nom +++ b/lib/metaprogramming.nom @@ -13,7 +13,7 @@ lua code ".." |nomsu:def(%s, %s, %s) |]]):format(nomsu:repr(canonical.src), thunk, nomsu:repr(body.src)) | if #aliases > 1 then - | lua = lua .. ([[ + | lua = lua .. "\n" .. ([[ |do | local aliased = %s | local src = %s @@ -27,8 +27,7 @@ lua code ".." |]]):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>") @@ -72,6 +71,8 @@ parse (compile %macro_def to block %body) as: escaped compile \%macro_def to cod | \(%body) |end +rule (do %) =: % + rule (%tree as lua) =: lua expr "nomsu:tree_to_lua(\(%tree))" rule (%tree as value) =: diff --git a/lib/operators.nom b/lib/operators.nom index 4d81806..7a926f3 100644 --- a/lib/operators.nom +++ b/lib/operators.nom @@ -29,11 +29,11 @@ compile (%obj's %key; %obj -> %key) to: "\(%obj as lua)[\(%key as lua)]" # Variable assignment operator, and += type versions compile (%var = %val) to code: "\(%var as lua) = \(%val as lua)" -compile (%var += %val) to code: "\(%var as lua) += \(%val as lua)" -compile (%var -= %val) to code: "\(%var as lua) -= \(%val as lua)" -compile (%var *= %val) to code: "\(%var as lua) *= \(%val as lua)" -compile (%var /= %val) to code: "\(%var as lua) /= \(%val as lua)" -compile (%var ^= %val) to code: "\(%var as lua) ^= \(%val as lua)" +compile (%var += %val) to code: "\(%var as lua) = \(%var as lua) + \(%val as lua)" +compile (%var -= %val) to code: "\(%var as lua) = \(%var as lua) - \(%val as lua)" +compile (%var *= %val) to code: "\(%var as lua) = \(%var as lua) * \(%val as lua)" +compile (%var /= %val) to code: "\(%var as lua) = \(%var as lua) / \(%val as lua)" +compile (%var ^= %val) to code: "\(%var as lua) = \(%var as lua) ^ \(%val as lua)" compile (%var and= %val) to code: "\(%var as lua) = \(%var as lua) and\(%val as lua)" compile (%var or= %val) to code: "\(%var as lua) = \(%var as lua) or \(%val as lua)" compile (%var join= %val) to code: "\(%var as lua) = \(%var as lua) .. \(%val as lua)" diff --git a/lib/permissions.nom b/lib/permissions.nom index 8d8b56d..a65fb67 100644 --- a/lib/permissions.nom +++ b/lib/permissions.nom @@ -4,17 +4,24 @@ require "lib/operators.nom" require "lib/collections.nom" # Permission functions +rule (standardize rules %rules) =: + if (lua expr "type(vars.rules) == 'string'"): %rules = [%rules] + (nomsu "get_stub" [%]) for all %rules rule (restrict %rules to within %elite-rules) =: + %rules =: standardize rules %rules + %elite-rules =: standardize rules %elite-rules say "Restricting \(%rules) to within \(%elite-rules)" for all (flatten [%elite-rules, %rules]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" - for all %rules: + for %rule in %rules: assert (nomsu "check_permission" [%]) ".." |You do not have permission to restrict permissions for function: \(%) - ((nomsu) ->* ["defs",%,"whiteset"]) =: - dict: [%, yes] for %it in %elite-rules + ((nomsu) ->* ["defs",%rule,"whiteset"]) =: + dict: [%, yes] for all %elite-rules rule (allow %elite-rules to use %rules) =: + %rules =: standardize rules %rules + %elite-rules =: standardize rules %elite-rules say "Allowing \(%elite-rules) to use \(%rules)" for all (flatten [%elite-rules, %rules]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" @@ -26,12 +33,14 @@ rule (allow %elite-rules to use %rules) =: for all %elite-rules: %whiteset -> % = (yes) rule (forbid %pleb-rules to use %rules) =: + %rules =: standardize rules %rules + %pleb-rules =: standardize rules %pleb-rules say "Forbidding \(%pleb-rules) to use \(%rules)" for all (flatten [%pleb-rules, %used]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" for all %rules: assert (nomsu "check_permission" [%]) ".." - |You do not have permission to grant permissions for function: \%it\ + |You do not have permission to grant permissions for function: \(%) %whiteset =: (nomsu) ->* ["defs",%,"whiteset"] assert %whiteset ".." |Cannot individually restrict permissions for \(%) because it is currently diff --git a/lib/plurals.nom b/lib/plurals.nom index 9df4060..d0cbcf0 100644 --- a/lib/plurals.nom +++ b/lib/plurals.nom @@ -18,18 +18,18 @@ with secrets: | return key |end}) - rule [the plural of %singular is %plural] =: + rule (the plural of %singular is %plural) =: (secret %plurals)->%singular =: %plural (secret %singulars)->%plural =: %singular (secret %canonicals)->%plural =: %singular - rule [singular %plural] =: + rule (singular %plural) =: %plural in (secret %singulars) - rule [plural %singular] =: + rule (plural %singular) =: %singular in (secret %plurals) - rule [canonicalize %item-name] =: + rule (canonicalize %item-name) =: %item-name in (secret %canonicals) - rule [rules that change plurals] =: ["the plural of % is %"] + rule (rules that change plurals) =: ["the plural of % is %"] diff --git a/lib/secrets.nom b/lib/secrets.nom index 756f988..d63ec8c 100644 --- a/lib/secrets.nom +++ b/lib/secrets.nom @@ -17,13 +17,4 @@ 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)" -with secrets: - secret %foo = 5 - rule (plumb %) =: - secret %foo = % - rule (frop) =: - secret %foo - -say (frop) -plumb 99 -say (frop) +rule (rules about secrecy) =: ["with secrets %"] |
