From 65dc1f2196b46dbd527d49da113515bea825416d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Tue, 26 Jun 2018 15:52:38 -0700 Subject: Cleaning up metaprogramming a bit and fixing/adding test for recursion control flow. --- core/control_flow.nom | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'core/control_flow.nom') 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 -- cgit v1.2.3