Generate code for for loops
authorLuke Lau <luke_lau@icloud.com>
Thu, 7 Nov 2019 17:53:54 +0000 (17:53 +0000)
committerLuke Lau <luke_lau@icloud.com>
Fri, 8 Nov 2019 15:07:39 +0000 (15:07 +0000)
commit1efb9b89acd3aeda0814540a5d96c49bb8b172c4
tree4fdbf4e22df7a6d90adfa3e37101e7a500d313d3
parentcda64ae4e38c4cc4f2d721c798515c9a36833e44
Generate code for for loops

Our for loops are like C style for loops, with an initial value,
condition and step.

We begin generating code by setting up the loop in the preheader. Here
we generate the initial value and compare it to the condition, finishing
early if we need to.

The main loop begins with choosing either the initial value, or the
incremented value for the loop variable (usually called the induction
variable). We can then put this inside the binding environment whenever
we generate the body expression with the `runReaderT` function: This
lets the body access the induction variable with the associated name,
without having to change our Reader transformer into a State
transformer.

Once we've generated the body, we just need to increment the induction
variable by the step, and check if the condition is met. Then depending
on the result of that we either branch back up to the top of the loop,
or to the after block to exit.

You might have noticed that we don't have any side-effects at the
moment, so you can't tell what went on inside a loop - it always
evaluates to zero. We're going to add something to do inside these loops
next.
Main.hs