diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/collections.nom | 43 | ||||
| -rw-r--r-- | lib/control_flow.nom | 62 | ||||
| -rw-r--r-- | lib/operators.nom | 4 | ||||
| -rw-r--r-- | lib/permissions.nom | 24 | ||||
| -rw-r--r-- | lib/plurals.nom | 4 |
5 files changed, 82 insertions, 55 deletions
diff --git a/lib/collections.nom b/lib/collections.nom index 022c1dc..5958bb9 100644 --- a/lib/collections.nom +++ b/lib/collections.nom @@ -19,7 +19,7 @@ parse [first in %list, first %list] as: 1 st in %list parse [last in %list, last %list] as: 1 st to last in %list # Dict iteration convenience function. This could also be accomplished with: for all (entries in %dict): ... -compile [for %key -> %value in %dict %body] to code: ".." +compile [for %key = %value in %dict %body] to code: ".." |do; | for k, v in pairs(\(%dict as lua)) do; | \(%key as lua), \(%value as lua) = k, v; @@ -29,7 +29,7 @@ compile [for %key -> %value in %dict %body] to code: ".." # Membership testing rule [%item is in %list, %list contains %item, %list has %item] =: - for %key -> %value in %list: + for %key = %value in %list: if (%key == %item): return (yes) return (no) @@ -38,7 +38,7 @@ rule [..] %list doesn't contain %item, %list does not contain %item %list doesn't have %item, %list does not have %item ..=: - for %key -> %value in %list: + for %key = %value in %list: if (%key == %item): return (no) return (yes) @@ -87,26 +87,53 @@ rule [flatten %lists] =: add %item to %flat %flat -rule [dict %items] =: +rule [dict from entries %items] =: %dict = [] for %pair in %items: %dict -> (%pair -> 1) = (%pair -> 2) %dict +compile [dict %items] to: + if ((%items's "type") == "Thunk"): + %item_codes = [] + for %func_call in (%items's "value"): + assert ((%func_call's "type") == "FunctionCall") ".." + |Invalid format for 'dict' expression. Only literals are allowed. + %tokens = (%func_call's "value") + %equals = (%tokens -> 2) + assert (lua expr "#\(%tokens) == 3 and \(%equals) and \(%equals).type == 'Word' and \(%equals).value == '='") ".." + |Invalid format for 'dict' expression. Lines must only have the "% = %" format, not \(%func_call's "src") + %key = (%tokens -> 1) + lua code ".." + |if \(%key).type == "Word" and \(%key).value:match("^[a-zA-Z_][a-zA-Z0-9_]*$") then + | \(%key_code) = \(%key).value; + |elseif \(%key).type == "Word" then + | \(%key_code) = "["..nomsu:repr(\(%key).value).."]"; + |else + | \(\{%key_code = "[\((%key as lua))]"} as lua statements) + |end + add "\(%key_code) = \((%tokens -> 3) as lua)" to %item_codes + return "{\(join %item_codes with glue ",\n")}" + ..else: + return (..) + (..) + nomsu "replaced_vars" [\(dict from entries %items), lua expr "vars"] + ..as lua + rule [entries in %dict] =: %entries = [] - for %k -> %v in %dict: - add (dict [["key",%k],["value",%v]]) to %entries + for %k = %v in %dict: + add (dict {key = %k; value = %v}) to %entries %entries rule [keys in %dict] =: %keys = [] - for %k -> %v in %dict: add %k to %keys + for %k = %v in %dict: add %k to %keys %keys rule [values in %dict] =: %values = [] - for %k -> %v in %dict: add %v to %values + for %k = %v in %dict: add %v to %values %values # List Comprehension diff --git a/lib/control_flow.nom b/lib/control_flow.nom index 2c51c50..84aca6c 100644 --- a/lib/control_flow.nom +++ b/lib/control_flow.nom @@ -21,7 +21,7 @@ compile [if %condition %if_body else %else_body, unless %condition %else_body el # Return compile [return] to code: "do; return; end;" -compile [return %return-value] to code: "do; return \(%return-value as lua); end;" +compile [return %return_value] to code: "do; return \(%return_value as lua); end;" # GOTOs compile [-> %label] to code: ".." @@ -44,11 +44,11 @@ rule [tree %tree has function call %call] =: compile [do next repeat-loop] to code: "goto continue_repeat;" compile [stop repeat-loop] to code: "goto stop_repeat;" compile [repeat while %condition %body] to code: - %continue-labels = (..) + %continue_labels = (..) "\n::continue_repeat::;" if (tree %body has function call \(do next repeat-loop)) else "" %code = ".." |while \(%condition as lua) do; - |\(%body as lua statements)\(%continue-labels) + |\(%body as lua statements)\(%continue_labels) |end;--while-loop if (tree %body has function call \(stop repeat-loop)): return ".." @@ -73,25 +73,25 @@ compile [..] for %var from %start to %stop by %step %body for %var from %start to %stop via %step %body ..to code: - %continue-labels = "" + %continue_labels = "" if (tree %body has function call \(do next for-loop)): - %continue-labels join= "\n::continue_for::;" + %continue_labels join= "\n::continue_for::;" if (tree %body has function call (nomsu "replaced_vars" [\(do next %), lua expr "{['']=\(%var)}"])): - %continue-labels join= "\n::continue_\(nomsu "var_to_lua_identifier" [%var])::;" + %continue_labels join= "\n::continue_\(nomsu "var_to_lua_identifier" [%var])::;" %code = ".." |for i=\(%start as lua),\(%stop as lua),\(%step as lua) do; # This trashes the loop variables, just like in Python. |\(%var as lua) = i; - |\(%body as lua statements)\(%continue-labels) + |\(%body as lua statements)\(%continue_labels) |end;--numeric for-loop - %stop-labels = "" + %stop_labels = "" if (tree %body has function call \(stop for-loop)): - %stop-labels join= "\n::stop_for::;" + %stop_labels join= "\n::stop_for::;" if (tree %body has function call (nomsu "replaced_vars" [\(stop %), lua expr "{['']=\(%var)}"])): - %stop-labels join= "\n::stop_\(nomsu "var_to_lua_identifier" [%var])::;" - if (%stop-labels != ""): ".." + %stop_labels join= "\n::stop_\(nomsu "var_to_lua_identifier" [%var])::;" + if (%stop_labels != ""): ".." |do;--for-loop label scope - |\(%code)\(%stop-labels) + |\(%code)\(%stop_labels) |end;--for-loop label scope ..else: %code parse [for %var from %start to %stop %body] as: for %var from %start to %stop via 1 %body @@ -102,25 +102,25 @@ parse [..] parse [for all %start to %stop %body] as: for all %start to %stop via 1 %body compile [for %var in %iterable %body] to code: - %continue-labels = "" + %continue_labels = "" if (tree %body has function call \(do next for-loop)): - %continue-labels join= "\n::continue_for::;" + %continue_labels join= "\n::continue_for::;" if (tree %body has function call (nomsu "replaced_vars" [\(do next %), lua expr "{['']=\(%var)}"])): - %continue-labels join= "\n::continue_\(nomsu "var_to_lua_identifier" [%var])::;" + %continue_labels join= "\n::continue_\(nomsu "var_to_lua_identifier" [%var])::;" %code = ".." |for i,value in ipairs(\(%iterable as lua)) do; # This trashes the loop variables, just like in Python. |\(%var as lua) = value; - |\(%body as lua statements)\(%continue-labels) + |\(%body as lua statements)\(%continue_labels) |end;--foreach-loop - %stop-labels = "" + %stop_labels = "" if (tree %body has function call \(stop for-loop)): - %stop-labels join= "\n::stop_for::;" + %stop_labels join= "\n::stop_for::;" if (tree %body has function call (nomsu "replaced_vars" [\(stop %), lua expr "{['']=\(%var)}"])): - %stop-labels join= "\n::stop_\(nomsu "var_to_lua_identifier" [%var])::;" - if (%stop-labels != ""): ".." + %stop_labels join= "\n::stop_\(nomsu "var_to_lua_identifier" [%var])::;" + if (%stop_labels != ""): ".." |do;--for-loop label scope - |\(%code)\(%stop-labels) + |\(%code)\(%stop_labels) |end;--for-loop label scope ..else: %code parse [for all %iterable %body] as: for % in %iterable %body @@ -131,10 +131,10 @@ compile [when %body] to code: %result = "" %fallthroughs = [] %first = (yes) - for %func-call in (%body's "value"): - assert ((%func-call's "type") == "FunctionCall") ".." + 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") + %tokens = (%func_call's "value") %star = (%tokens -> 1) assert (lua expr "vars.star and vars.star.type == 'Word' and vars.star.value == '*'") ".." |Invalid format for 'when' statement. Lines must begin with '*' @@ -146,7 +146,7 @@ compile [when %body] to code: %action = (%tokens -> 3) if (%action == (nil)): lua block "table.insert(vars.fallthroughs, vars.condition)" - do next %func-call + do next %func_call if (lua expr "vars.condition.type == 'Word' and vars.condition.value == 'else'"): %result join= ".." @@ -171,14 +171,14 @@ compile [when %body] to code: %result # Switch statement -compile [when %branch-value == ? %body] to code: +compile [when %branch_value == ? %body] to code: %result = "" %fallthroughs = [] %first = (yes) - for %func-call in (%body's "value"): - assert ((%func-call's "type") == "FunctionCall") ".." + 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") + %tokens = (%func_call's "value") %star = (%tokens -> 1) assert (lua expr "vars.star and vars.star.type == 'Word' and vars.star.value == '*'") ".." |Invalid format for 'when' statement. Lines must begin with '*' @@ -190,7 +190,7 @@ compile [when %branch-value == ? %body] to code: %action = (%tokens -> 3) if (%action == (nil)): lua block "table.insert(vars.fallthroughs, vars.condition)" - do next %func-call + do next %func_call if (lua expr "vars.condition.type == 'Word' and vars.condition.value == 'else'"): %result join= ".." @@ -213,7 +213,7 @@ compile [when %branch-value == ? %body] to code: if (%result != ""): %result = ".." |do;--when == ? - |local branch_value = \(%branch-value as lua);\(%result) + |local branch_value = \(%branch_value as lua);\(%result) |end; |end;--when == ? %result diff --git a/lib/operators.nom b/lib/operators.nom index 13e6ce4..09bdbcd 100644 --- a/lib/operators.nom +++ b/lib/operators.nom @@ -29,7 +29,7 @@ compile [..] |end)(nomsu, vars) # Indexing: -compile [%obj's %key, %obj -> %key] to: "(\(%obj as lua))[\(%key as lua)]" +compile [%obj'%key, %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);" @@ -90,7 +90,7 @@ lua block ".." # Chained compairsions (e.g. x < y <= z) are defined up to 3 operands lua block ".." |local max_operands = 3; - |for _,chainers in ipairs({{"<","<="},{">",">="}}) do; + |for _,chainers in ipairs({{"<","< ="},{">","> ="}}) do; | local function recurse(chainers, chain) # The 1-op versions are already more efficiently defined, and a 0-op version doesnt make sense | if #chain >= 2 then; diff --git a/lib/permissions.nom b/lib/permissions.nom index 1725683..3231b25 100644 --- a/lib/permissions.nom +++ b/lib/permissions.nom @@ -15,33 +15,33 @@ rule [standardize rules %rules] =: keys in %set -rule [restrict %rules to within %elite-rules] =: +rule [restrict %rules to within %elite_rules] =: %rules = (standardize rules %rules) - %elite-rules = (standardize rules %elite-rules) - for all (flatten [%elite-rules, %rules]): + %elite_rules = (standardize rules %elite_rules) + for all (flatten [%elite_rules, %rules]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" for %rule in %rules: assert (nomsu "check_permission" [%]) ".." |You do not have permission to restrict permissions for function: \(%) ((nomsu) ->* ["defs",%rule,"whiteset"]) = (..) - dict ([%, yes] for all %elite-rules) + dict ([%, yes] for all %elite_rules) -rule [allow %elite-rules to use %rules] =: +rule [allow %elite_rules to use %rules] =: %rules = (standardize rules %rules) - %elite-rules = (standardize rules %elite-rules) - for all (flatten [%elite-rules, %rules]): + %elite_rules = (standardize rules %elite_rules) + for all (flatten [%elite_rules, %rules]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" for %rule in %rules: assert (nomsu "check_permission" [%rule]) ".." |You do not have permission to grant permissions for function: \(%rule) %whiteset = ((nomsu) ->* ["defs",%rule,"whiteset"]) if (not %whiteset): go to next %rule - for all %elite-rules: %whiteset -> % = (yes) + for all %elite_rules: %whiteset -> % = (yes) -rule [forbid %pleb-rules to use %rules] =: +rule [forbid %pleb_rules to use %rules] =: %rules = (standardize rules %rules) - %pleb-rules = (standardize rules %pleb-rules) - for all (flatten [%pleb-rules, %used]): + %pleb_rules = (standardize rules %pleb_rules) + for all (flatten [%pleb_rules, %used]): assert ((nomsu's "defs") has key %) "Undefined function: \(%)" for all %rules: assert (nomsu "check_permission" [%]) ".." @@ -50,4 +50,4 @@ rule [forbid %pleb-rules to use %rules] =: assert %whiteset ".." |Cannot individually restrict permissions for \(%) because it is currently |available to everyone. Perhaps you meant to use "restrict % to within %" instead? - for all %pleb-rules: %whiteset's % = (nil) + for all %pleb_rules: %whiteset's % = (nil) diff --git a/lib/plurals.nom b/lib/plurals.nom index 347c2e7..da0fa4d 100644 --- a/lib/plurals.nom +++ b/lib/plurals.nom @@ -29,7 +29,7 @@ with secrets: rule [plural %singular] =: %singular in (secret %plurals) - rule [canonicalize %item-name] =: - %item-name in (secret %canonicals) + rule [canonicalize %item_name] =: + %item_name in (secret %canonicals) rule [rules that change plurals] =: ["the plural of % is %"] |
