From bce6cd2e216b01d28d041f47d927ea0819c27533 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Thu, 14 Sep 2017 06:23:50 -0700 Subject: [PATCH] Added dict comprehension and abbreviated loop forms. --- core.nom | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/core.nom b/core.nom index 7ed6d00..073d79e 100644 --- a/core.nom +++ b/core.nom @@ -161,7 +161,17 @@ macro block "for %varname in %iterable %body": | vars[\%varname\] = old_loopval |end -# Comprehension +macro block "for all %iterable %body": + ".."|do + | local old_loopval = vars.it + | for i,value in ipairs(\%iterable as lua expr\) do + | vars.it = value + | \(lua expr "vars.body.value.value") as lua block\ + | end + | vars.it = old_loopval + |end + +# List Comprehension # TODO: maybe make this lazy, or a lazy version? macro "%expression for %varname in %iterable": ".."|(function(game, vars) @@ -173,6 +183,37 @@ macro "%expression for %varname in %iterable": | return comprehension |end)(game, setmetatable({}, {__index=vars})) +macro "%expression for all %iterable": + ".."|(function(game, vars) + | local comprehension = {} + | for i,value in ipairs(\%iterable as lua expr\) do + | vars.it = value + | comprehension[i] = \%expression as lua expr\ + | end + | return comprehension + |end)(game, setmetatable({}, {__index=vars})) + +# Dict comprehension +macro "%key = %value for %varname in %iterable": + ".."|(function(game, vars) + | local comprehension = {} + | for i,value in ipairs(\%iterable as lua expr\) do + | vars[\%varname as lua expr\] = value + | comprehension[\%key as lua expr\] = \%value as lua expr\ + | end + | return comprehension + |end)(game, setmetatable({}, {__index=vars})) + +macro "%key = %value for all %iterable": + ".."|(function(game, vars) + | local comprehension = {} + | for i,value in ipairs(\%iterable as lua expr\) do + | vars.it = value + | comprehension[\%key as lua expr\] = \%value as lua expr\ + | end + | return comprehension + |end)(game, setmetatable({}, {__index=vars})) + # Number ranges rule "%start up to %stop": lua expr "utils.range(vars.start,vars.stop-1)"