aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/loop.lux104
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 _])