diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux | 104 |
1 files changed, 64 insertions, 40 deletions
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux index 9f03e9bb1..e97ee4c43 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux @@ -1,45 +1,64 @@ (.using - [library - [lux {"-" Scope} - [abstract - ["[0]" monad {"+" do}]] - [data - ["[0]" product] - ["[0]" text - ["%" format {"+" format}]] - [collection - ["[0]" list ("[1]#[0]" functor mix)]]] - [math - [number - ["n" nat]]] - [target - ["_" js {"+" Computation Var Expression Statement}]]]] - ["[0]" // "_" - [runtime {"+" Operation Phase Phase! Generator Generator!}] - ["[1][0]" case] - ["///[1]" //// "_" - [synthesis {"+" Scope Synthesis}] - ["[1][0]" generation] - ["//[1]" /// "_" - ["[1][0]" phase] - [reference - [variable {"+" Register}]]]]]) + [library + [lux {"-" Scope} + [abstract + ["[0]" monad {"+" do}]] + [data + ["[0]" product] + ["[0]" text + ["%" format {"+" format}]] + [collection + ["[0]" list ("[1]#[0]" functor mix)]]] + [math + [number + ["n" nat]]] + [target + ["_" js {"+" Computation Var Expression Statement}]]]] + ["[0]" // "_" + [runtime {"+" Operation Phase Phase! Generator Generator!}] + ["[1][0]" case] + ["///[1]" //// "_" + [synthesis {"+" Scope Synthesis}] + ["[1][0]" generation] + ["//[1]" /// "_" + ["[1][0]" phase] + [reference + [variable {"+" Register}]]]]]) (def: @scope (-> Nat Text) (|>> %.nat (format "scope"))) -(def: (setup initial? offset bindings body) - (-> Bit Register (List Expression) Statement Statement) - (|> bindings - list.enumeration - (list#each (function (_ [register value]) - (let [variable (//case.register (n.+ offset register))] - (if initial? - (_.define variable value) - (_.set variable value))))) - list.reversed - (list#mix _.then body))) +(def: $iteration + (-> Nat Var) + (|>> %.nat (format "iteration") _.var)) + +(def: (setup $iteration initial? offset bindings body) + (-> Var Bit Register (List Expression) Statement Statement) + (case bindings + (^ (list)) + body + + (^ (list binding)) + (let [$binding (//case.register offset)] + ($_ _.then + (if initial? + (_.define $binding binding) + (_.set $binding binding)) + body + )) + + _ + (|> bindings + list.enumeration + (list#each (function (_ [register _]) + (let [variable (//case.register (n.+ offset register))] + (if initial? + (_.define variable (_.at (_.i32 (.int register)) $iteration)) + (_.set variable (_.at (_.i32 (.int register)) $iteration)))))) + list.reversed + (list#mix _.then body) + (_.then (_.define $iteration (_.array bindings)))))) (def: .public (scope! statement expression archive [start initsS+ bodyS]) (Generator! (Scope Synthesis)) @@ -54,8 +73,11 @@ [@scope (# ! each ..@scope /////generation.next) initsO+ (monad.each ! (expression archive) initsS+) body! (/////generation.with_anchor [start @scope] - (statement expression archive bodyS))] - (in (..setup true start initsO+ + (statement expression archive bodyS)) + $iteration (# ! each ..$iteration /////generation.next)] + (in (..setup $iteration + true start + initsO+ (_.with_label (_.label @scope) (_.do_while (_.boolean true) body!))))))) @@ -80,10 +102,12 @@ (Generator! (List Synthesis)) (do [! ///////phase.monad] [[offset @scope] /////generation.anchor - argsO+ (monad.each ! (expression archive) argsS+)] + argsO+ (monad.each ! (expression archive) argsS+) + $iteration (# ! each ..$iteration /////generation.next)] (in ($_ _.then (_.define @temp (_.array argsO+)) - (..setup false offset + (..setup $iteration + false offset (|> argsO+ list.enumeration (list#each (function (_ [idx _]) |