diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-06-18 15:44:29 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-06-18 15:44:35 -0700 |
| commit | 16d127abb507751808eca65108710d3de1fd3cab (patch) | |
| tree | 53a78ad2e88a95048eea76426e62c05c2c5102a5 /core/collections.nom | |
| parent | fc71b0331b6122c774585c3ab93e6e55978ecaf2 (diff) | |
Initial working version.
Diffstat (limited to 'core/collections.nom')
| -rw-r--r-- | core/collections.nom | 294 |
1 files changed, 145 insertions, 149 deletions
diff --git a/core/collections.nom b/core/collections.nom index 8a59852..69a51c7 100644 --- a/core/collections.nom +++ b/core/collections.nom @@ -9,162 +9,158 @@ use "core/operators.nom" # List/dict functions: # Indexing -immediately - compile [..] - %index st to last in %list, %index nd to last in %list, %index rd to last in %list - %index th to last in %list - ..to: Lua value "utils.nth_to_last(\(%list as lua expr), \(%index as lua expr))" +compile [..] + %index st to last in %list, %index nd to last in %list, %index rd to last in %list + %index th to last in %list +..to: Lua value "utils.nth_to_last(\(%list as lua expr), \(%index as lua expr))" -immediately - parse [last in %list] as: 1st to last in %list - parse [first in %list] as: %list.1 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +parse [last in %list] as: 1st to last in %list +parse [first in %list] as: %list.1 # Membership testing -immediately - action [%item is in %list, %list contains %item, %list has %item] - for %key = %value in %list - if (%key is %item): return (yes) - return (no) - - action [..] - %item isn't in %list, %item is not in %list - %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 - if (%key is %item): return (no) - return (yes) - -immediately - parse [%list has key %index, %list has index %index] as - %list.%index != (nil) - - parse [..] - %list doesn't have key %index, %list does not have key %index - %list doesn't have index %index, %list does not have index %index - ..as - %list.%index = (nil) - - compile [number of keys in %list] to - Lua value "utils.size(\(%list as lua expr))" - - compile [append %item to %list, add %item to %list, to %list add %item, to %list append %item] to - Lua "table.insert(\(%list as lua expr), \(%item as lua expr))" - - compile [pop from %list, remove last from %list] to - Lua "table.remove(\(%list as lua expr))" - - compile [remove index %index from %list] to - Lua "table.remove(\(%list as lua expr), \(%index as lua expr))" +action [%item is in %list, %list contains %item, %list has %item] + for %key = %value in %list + if (%key is %item): return (yes) + return (no) + +action [..] + %item isn't in %list, %item is not in %list + %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 + if (%key is %item): return (no) + return (yes) + +parse [%list has key %index, %list has index %index] as + %list.%index != (nil) + +parse [..] + %list doesn't have key %index, %list does not have key %index + %list doesn't have index %index, %list does not have index %index +..as + %list.%index = (nil) + +compile [number of keys in %list] to + Lua value "utils.size(\(%list as lua expr))" + +compile [append %item to %list, add %item to %list, to %list add %item, to %list append %item] to + Lua "table.insert(\(%list as lua expr), \(%item as lua expr))" + +compile [pop from %list, remove last from %list] to + Lua "table.remove(\(%list as lua expr))" + +compile [remove index %index from %list] to + Lua "table.remove(\(%list as lua expr), \(%index as lua expr))" # List Comprehension -immediately - parse [%expression for %item in %iterable] as - result of - %comprehension <- [] - for %item in %iterable - add %expression to %comprehension - return %comprehension - - parse [..] - %expression for %index in %start to %stop via %step - %expression for %index in %start to %stop by %step - ..as - result of - %comprehension <- [] - for %index in %start to %stop via %step - add %expression to %comprehension - return %comprehension - - parse [%expression for %var in %start to %stop] as - %expression for %var in %start to %stop via 1 - - parse [..] - %expression for %key = %value in %iterable - %expression for (%key,%value) in %iterable - ..as - result of - %comprehension <- [] - for %key = %value in %iterable - add %expression to %comprehension - return %comprehension - - # Dict comprehensions - parse [..] - %key = %value for %item in %iterable - (%key,%value) for %item in %iterable - ..as - result of - %comprehension <- {} - for %item in %iterable - %comprehension.%key <- %value - return %comprehension - - parse [..] - %key = %value for %src_key = %src_value in %iterable - (%key,%value) for (%src_key,%src_value) in %iterable - ..as - result of - %comprehension <- {} - for %src_key = %src_value in %iterable - %comprehension.%key <- %value - return %comprehension - -immediately - action [%lists flattened] - %flat <- [] - for %list in %lists - for %item in %list - add %item to %flat - return %flat - - parse [entries in %dict] as: {key:%k, value:%v} for %k = %v in %dict - parse [keys in %dict, keys of %dict] as: %k for %k = %v in %dict - parse [values in %dict, values of %dict] as: %v for %k = %v in %dict +parse [%expression for %item in %iterable] as + result of + %comprehension <- [] + for %item in %iterable + add %expression to %comprehension + return %comprehension + +parse [..] + %expression for %index in %start to %stop via %step + %expression for %index in %start to %stop by %step +..as + result of + %comprehension <- [] + for %index in %start to %stop via %step + add %expression to %comprehension + return %comprehension + +parse [%expression for %var in %start to %stop] as + %expression for %var in %start to %stop via 1 + +parse [..] + %expression for %key = %value in %iterable + %expression for (%key,%value) in %iterable +..as + result of + %comprehension <- [] + for %key = %value in %iterable + add %expression to %comprehension + return %comprehension + +# Dict comprehensions +parse [..] + %key = %value for %item in %iterable + (%key,%value) for %item in %iterable +..as + result of + %comprehension <- {} + for %item in %iterable + %comprehension.%key <- %value + return %comprehension + +parse [..] + %key = %value for %src_key = %src_value in %iterable + (%key,%value) for (%src_key,%src_value) in %iterable +..as + result of + %comprehension <- {} + for %src_key = %src_value in %iterable + %comprehension.%key <- %value + return %comprehension + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +action [%lists flattened] + %flat <- [] + for %list in %lists + for %item in %list + add %item to %flat + return %flat + +parse [entries in %dict] as: {key:%k, value:%v} for %k = %v in %dict +parse [keys in %dict, keys of %dict] as: %k for %k = %v in %dict +parse [values in %dict, values of %dict] as: %v for %k = %v in %dict # Metatable stuff -immediately - compile [set %dict's metatable to %metatable] to - Lua "setmetatable(\(%dict as lua expr), \(%metatable as lua expr));" - - compile [%dict with fallback %key -> %value] to - Lua value ".." - setmetatable(\(%dict as lua expr), {__index=function(self, \(%key as lua expr)) - local value = \(%value as lua expr) - self[\(%key as lua expr)] = value - return value - end}) +compile [set %dict's metatable to %metatable] to + Lua "setmetatable(\(%dict as lua expr), \(%metatable as lua expr));" + +compile [%dict with fallback %key -> %value] to + Lua value ".." + setmetatable(\(%dict as lua expr), {__index=function(self, \(%key as lua expr)) + local value = \(%value as lua expr) + self[\(%key as lua expr)] = value + return value + end}) # Sorting -immediately - compile [sort %items] to: Lua "table.sort(\(%items as lua expr));" - parse [..] - sort %items by %item = %key_expr - sort %items by %item -> %key_expr - ..as - do - %keys <- ({} with fallback %item -> %key_expr) - lua> "table.sort(\%items, function(x,y) return \%keys[x] < \%keys[y] end)" - -immediately - action [%items sorted, sorted %items] - %copy <- (% for % in %items) - sort %copy - return %copy - action [..] - %items sorted by %item = %key - %items sorted by %item -> %key - .. - %copy <- (% for % in %items) - sort %copy by %item = %key - return %copy - - action [unique %items] - %unique <- [] - %seen <- {} - for % in %items - unless: %seen.% - add % to %unique - %seen.% <- (yes) - return %unique +compile [sort %items] to: Lua "table.sort(\(%items as lua expr));" +parse [..] + sort %items by %item = %key_expr + sort %items by %item -> %key_expr +..as + do + %keys <- ({} with fallback %item -> %key_expr) + lua> "table.sort(\%items, function(x,y) return \%keys[x] < \%keys[y] end)" + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +action [%items sorted, sorted %items] + %copy <- (% for % in %items) + sort %copy + return %copy +action [..] + %items sorted by %item = %key + %items sorted by %item -> %key +.. + %copy <- (% for % in %items) + sort %copy by %item = %key + return %copy + +action [unique %items] + %unique <- [] + %seen <- {} + for % in %items + unless: %seen.% + add % to %unique + %seen.% <- (yes) + return %unique |
