aboutsummaryrefslogtreecommitdiff
path: root/core/collections.nom
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-05-27 18:28:23 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-05-27 18:29:23 -0700
commit2e15c0fd5067318601e2f3b70ee6fc16ef58200d (patch)
tree0006e0825b2680d457bb531c3d079661b16d6bc8 /core/collections.nom
parent6ce32bdd25694d71dc232c50a008f8824f8a75ce (diff)
Some tweaks/cleanup on the nomsu code as well as adding variable
mangling to 'parse % as %' to make almost hygienic macros.
Diffstat (limited to 'core/collections.nom')
-rw-r--r--core/collections.nom44
1 files changed, 23 insertions, 21 deletions
diff --git a/core/collections.nom b/core/collections.nom
index 7922a4f..81ff3d2 100644
--- a/core/collections.nom
+++ b/core/collections.nom
@@ -113,23 +113,39 @@ immediately
parse [keys in %dict] as: %k for %k = %v in %dict
parse [values in %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})
+
+immediately
+ parse [new counter] as: {} with fallback % -> 0
+ parse [new default dict] as: {} with fallback % -> {}
+
# Sorting
immediately
compile [sort %items] to: Lua "table.sort(\(%items as lua expr));"
- compile [sort %items by %key_expr] to
- Lua ".."
- utils.sort(\(%items as lua expr), function(_)
- return \(%key_expr as lua expr);
- end);
+ parse [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 %key]
+ action [%items sorted by %item = %key]
%copy <- (% for % in %items)
- sort %copy by %key
+ sort %copy by %item = %key
return %copy
action [unique %items]
@@ -141,19 +157,5 @@ immediately
(% in %seen) <- (yes)
return %unique
-immediately
- # Metatable stuff
- compile [set %dict's metatable to %metatable] to
- Lua "setmetatable(\(%dict as lua expr), \(%metatable as lua expr));"
-
- compile [new counter] to: Lua value "setmetatable({}, {__index=function() return 0; end})"
-
- compile [new default dict] to
- Lua value ".."
- setmetatable({}, {__index=function(self, key)
- t = {};
- self[key] = t;
- return t;
- end})
# TODO: maybe make a generator/coroutine?