aboutsummaryrefslogtreecommitdiff
path: root/core/control_flow.nom
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-06-26 15:52:38 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-06-26 15:53:00 -0700
commit65dc1f2196b46dbd527d49da113515bea825416d (patch)
tree02dbbe6528dc9c4a1e71a522da624a08f1179d64 /core/control_flow.nom
parent42578872c72ec46b256a093f74482fb6e5b8e4b9 (diff)
Cleaning up metaprogramming a bit and fixing/adding test for recursion
control flow.
Diffstat (limited to 'core/control_flow.nom')
-rw-r--r--core/control_flow.nom28
1 files changed, 15 insertions, 13 deletions
diff --git a/core/control_flow.nom b/core/control_flow.nom
index 0cc8f4e..61438d1 100644
--- a/core/control_flow.nom
+++ b/core/control_flow.nom
@@ -385,16 +385,18 @@ compile [result of %body] to
Lua value "(\(compile as: [] -> %body))()"
# Recurion control flow
-using
- compile [%var's stack] to: Lua value "stack\(%var as lua id)"
-..compile
- parse [for %var in recursive %structure %body] as
- with local {(%var's stack): [%structure], action: recurse % on %}
- action [recurse %v on %x]
- add %x to (%v's stack)
- repeat while: (length of (%var's stack)) > 0
- %var <- (remove 1 from (%var's stack))
- %body
- === next %var ==
- === stop %var ===
-
+compile [for %var in recursive %structure %body] to
+ with local compile actions
+ compile [recurse %v on %x] to
+ Lua "table.insert(stack\(%v as lua id), \(%x as lua expr))"
+ return
+ Lua ".."
+ do
+ local stack\(%var as lua id) = list{\(%structure as lua expr)}
+ while #stack\(%var as lua id) > 0 do
+ \(%var as lua expr) = table.remove(stack\(%var as lua id), 1)
+ \(%body as lua statements)
+ \(compile as: === next %var ===)
+ end
+ \(compile as: === stop %var ===)
+ end