aboutsummaryrefslogtreecommitdiff
path: root/core/collections.nom
diff options
context:
space:
mode:
Diffstat (limited to 'core/collections.nom')
-rw-r--r--core/collections.nom234
1 files changed, 111 insertions, 123 deletions
diff --git a/core/collections.nom b/core/collections.nom
index ce3f61e..100781b 100644
--- a/core/collections.nom
+++ b/core/collections.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V1
+#!/usr/bin/env nomsu -V2.2.4.3
#
This file contains code that supports manipulating and using collections like lists
and dictionaries.
@@ -8,173 +8,165 @@ use "core/control_flow.nom"
use "core/operators.nom"
# List/dict functions:
-
# Indexing
-test: assume: (2nd to last in [1,2,3,4,5]) is 4
+test: assume ((2 nd to last in [1, 2, 3, 4, 5]) is 4)
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))"
+..to (Lua value "utils.nth_to_last(\(%list as lua expr), \(%index as lua expr))")
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-parse [last in %list] as: 1st to last in %list
-parse [first in %list] as: %list.1
+parse [last in %list] as (1 st to last in %list)
+parse [first in %list] as %list.1
# Membership testing
-test: assume: 3 is in [1,2,3,4,5]
-action [%item is in %list, %list contains %item, %list has %item]
- for %key = %value in %list
- if (%key is %item): return (yes)
+test: assume (3 is in [1, 2, 3, 4, 5])
+action [%item is in %list, %list contains %item, %list has %item]:
+ for %key = %value in %list: if (%key is %item): return (yes)
return (no)
-test: assume: 99 isn't in [1,2,3]
+test: assume (99 isn't in [1, 2, 3])
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)
+ %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)
-test: assume: {x:no} has key "x"
-parse [%list has key %index, %list has index %index] as
- %list.%index != (nil)
+test: assume ({"x": no} has key "x")
+parse [%list has key %index, %list has index %index] as (%list.%index != (nil))
+test:
+ assume ({"x": no} doesn't have key "y")
+ assume (not ({"x": no} doesn't have key "x"))
-test
- assume: {x:no} doesn't have key "y"
- assume: not: {x:no} doesn't have key "x"
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)
+..as (%list.%index = (nil))
-compile [number of keys in %list] to
+compile [number of keys in %list] to (..)
Lua value "utils.size(\(%list as lua expr))"
-test
- %list <- [1,2,3,4,5]
+test:
+ %list <- [1, 2, 3, 4, 5]
append 6 to %list
- assume: (last in %list) is 6
+ assume ((last in %list) is 6)
pop from %list
- assume: (last in %list) is 5
+ assume ((last in %list) is 5)
remove index 1 from %list
- assume: (first in %list) is 2
+ assume ((first in %list) is 2)
-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 [..]
+ 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
+compile [pop from %list, remove last from %list] to (..)
Lua value "table.remove(\(%list as lua expr))"
-compile [remove index %index from %list] to
+compile [remove index %index from %list] to (..)
Lua value "table.remove(\(%list as lua expr), \(%index as lua expr))"
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# List Comprehension
-test: assume: ((% * %) for % in [1,2,3]) = [1,4,9]
-parse [%expression for %item in %iterable] as
- result of
+test: assume (((% * %) for % in [1, 2, 3]) = [1, 4, 9])
+parse [%expression for %item in %iterable] as (..)
+ result of:
%comprehension <- []
- for %item in %iterable
- add %expression to %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
+..as (..)
+ result of:
%comprehension <- []
- for %index in %start to %stop via %step
- add %expression to %comprehension
+ for %index in %start to %stop via %step: add %expression to %comprehension
return %comprehension
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test: assume: ((% * %) for % in 1 to 3) = [1,4,9]
-parse [%expression for %var in %start to %stop] as
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+test: assume (((% * %) for % in 1 to 3) = [1, 4, 9])
+parse [%expression for %var in %start to %stop] as (..)
%expression for %var in %start to %stop via 1
-test: assume: ("\%k,\%v" for %k = %v in {x:1}) = ["x,1"]
+test: assume (("\%k,\%v" for %k = %v in {"x": 1}) = ["x,1"])
parse [..]
%expression for %key = %value in %iterable
- %expression for (%key,%value) in %iterable
-..as
- result of
+ %expression for %key %value in %iterable
+..as (..)
+ result of:
%comprehension <- []
- for %key = %value in %iterable
- add %expression to %comprehension
+ for %key = %value in %iterable: add %expression to %comprehension
return %comprehension
+
# Dict comprehensions
-test: assume: ((% * %) = % for % in [1,2,3]) = {1:1,4:2,9:3}
-parse [..]
- %key = %value for %item in %iterable
- (%key,%value) for %item in %iterable
-..as
- result of
+test: assume (((% * %) = % for % in [1, 2, 3]) = {1: 1, 4: 2, 9: 3})
+parse [%key = %value for %item in %iterable, %key %value for %item in %iterable]
+..as (..)
+ result of:
%comprehension <- {}
- for %item in %iterable
- %comprehension.%key <- %value
+ for %item in %iterable: %comprehension.%key <- %value
return %comprehension
-test: assume: (%k = (%v * %v) for %k = %v in {x:1,y:2,z:3}) = {x:1,y:4,z:9}
+test:
+ assume (..)
+ (%k = (%v * %v) for %k = %v in {"x": 1, "y": 2, "z": 3}) = {"x": 1, "y": 4, "z": 9}
+
parse [..]
%key = %value for %src_key = %src_value in %iterable
- (%key,%value) for (%src_key,%src_value) in %iterable
-..as
- result of
+ %key %value for %src_key %src_value in %iterable
+..as (..)
+ result of:
%comprehension <- {}
- for %src_key = %src_value in %iterable
- %comprehension.%key <- %value
+ for %src_key = %src_value in %iterable: %comprehension.%key <- %value
return %comprehension
parse [..]
%key = %value for %item in %start to %stop via %step
- (%key,%value) for %item in %start to %stop via %step
-..as
- result of
+ %key %value for %item in %start to %stop via %step
+..as (..)
+ result of:
%comprehension <- {}
- for %item in %start to %stop via %step
- %comprehension.%key <- %value
+ for %item in %start to %stop via %step: %comprehension.%key <- %value
return %comprehension
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test: assume: ((% * %) = % for % in 1 to 3) = {1:1,4:2,9:3}
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+test: assume (((% * %) = % for % in 1 to 3) = {1: 1, 4: 2, 9: 3})
parse [..]
%key = %value for %item in %start to %stop
- (%key,%value) for %item in %start to %stop
-..as: %key = %value for %item in %start to %stop via 1
+ %key %value for %item in %start to %stop
+..as (%key = %value for %item in %start to %stop via 1)
-test: assume: ([[1,2],[3,4]] flattened) = [1,2,3,4]
-action [%lists flattened]
+test: assume (([[1, 2], [3, 4]] flattened) = [1, 2, 3, 4])
+action [%lists flattened]:
%flat <- []
- for %list in %lists
- for %item in %list
- add %item to %flat
+ for %list in %lists: for %item in %list: add %item to %flat
return %flat
-test: assume: (entries in {x:1}) = [{key:"x",value:1}]
-parse [entries in %dict] as: {key:%k, value:%v} for %k = %v in %dict
-
-test: assume: (keys in {x:1}) = ["x"]
-parse [keys in %dict, keys of %dict] as: %k for %k = %v in %dict
-
-test: assume: (values in {x:1}) = [1]
-parse [values in %dict, values of %dict] as: %v for %k = %v in %dict
+test: assume ((entries in {"x": 1}) = [{"key": "x", "value": 1}])
+parse [entries in %dict] as ({"key": %k, "value": %v} for %k = %v in %dict)
+test: assume ((keys in {"x": 1}) = ["x"])
+parse [keys in %dict, keys of %dict] as (%k for %k = %v in %dict)
+test: assume ((values in {"x": 1}) = [1])
+parse [values in %dict, values of %dict] as (%v for %k = %v in %dict)
# Metatable stuff
-test
+test:
%t <- {}
- set %t's metatable to {__tostring:[%]->"XXX"}
- assume: "\%t" = "XXX"
-compile [set %dict's metatable to %metatable] to
+ set %t 's metatable to {"__tostring": [%] -> "XXX"}
+ assume ("\%t" = "XXX")
+
+compile [set %dict 's metatable to %metatable] to (..)
Lua "setmetatable(\(%dict as lua expr), \(%metatable as lua expr));"
-test: assume: ({} with fallback % -> (% + 1)).10 = 11
-compile [%dict with fallback %key -> %value] to
+test: assume (({} with fallback % -> (% + 1)).10 = 11)
+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)
@@ -182,48 +174,44 @@ compile [%dict with fallback %key -> %value] to
return value
end})
+
# Sorting
-test
- %x <- [3,1,2]
+test:
+ %x <- [3, 1, 2]
sort %x
- assume: %x = [1,2,3]
- sort %x by % = (-%)
- assume: %x = [3,2,1]
- %keys <- {1:999,2:0,3:50}
+ assume (%x = [1, 2, 3])
+ sort %x by % = (- %)
+ assume (%x = [3, 2, 1])
+ %keys <- {1: 999, 2: 0, 3: 50}
sort %x by % = %keys.%
- assume: %x = [2,3,1]
-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
+ assume (%x = [2, 3, 1])
+
+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)"
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test: assume: (sorted [3,1,2]) = [1,2,3]
-action [%items sorted, sorted %items]
+test: assume ((sorted [3, 1, 2]) = [1, 2, 3])
+action [%items sorted, sorted %items]:
%copy <- (% for % in %items)
sort %copy
return %copy
-parse [..]
- %items sorted by %item = %key
- %items sorted by %item -> %key
-..as
- result of
+
+parse [%items sorted by %item = %key, %items sorted by %item -> %key] as (..)
+ result of:
%copy <- (% for % in %items)
sort %copy by %item = %key
return %copy
-test: assume: (unique [1,2,1,3,2,3]) = [1,2,3]
-action [unique %items]
+test: assume ((unique [1, 2, 1, 3, 2, 3]) = [1, 2, 3])
+action [unique %items]:
%unique <- []
%seen <- {}
- for % in %items
- unless: %seen.%
+ for % in %items:
+ unless %seen.%:
add % to %unique
%seen.% <- (yes)
return %unique
-