| 5377 |      1 | CodeGen = Main +
 | 
|  |      2 | types 'v binop = 'v => 'v => 'v
 | 
|  |      3 | datatype ('a,'v) expr = Cex 'v
 | 
|  |      4 |                       | Vex 'a
 | 
|  |      5 |                       | Bex ('v binop)  (('a,'v) expr) (('a,'v) expr)
 | 
|  |      6 | consts value :: ('a => 'v) => ('a,'v)expr => 'v
 | 
|  |      7 | primrec
 | 
|  |      8 | "value env (Cex v) = v"
 | 
|  |      9 | "value env (Vex a) = env a"
 | 
|  |     10 | "value env (Bex f e1 e2) = f (value env e1) (value env e2)"
 | 
|  |     11 | datatype ('a,'v) instr = Const 'v
 | 
|  |     12 |                        | Load 'a
 | 
|  |     13 |                        | Apply ('v binop)
 | 
|  |     14 | consts exec :: ('a => 'v) => 'v list => (('a,'v) instr) list => 'v list
 | 
|  |     15 | primrec
 | 
|  |     16 | "exec s vs [] = vs"
 | 
|  |     17 | "exec s vs (i#is) = (case i of
 | 
|  |     18 |     Const v  => exec s (v#vs) is
 | 
|  |     19 |   | Load a   => exec s ((s a)#vs) is
 | 
|  |     20 |   | Apply f  => exec s ( (f (hd vs) (hd(tl vs)))#(tl(tl vs)) ) is)"
 | 
|  |     21 | consts comp :: ('a,'v) expr => (('a,'v) instr) list
 | 
|  |     22 | primrec
 | 
|  |     23 | "comp (Cex v)       = [Const v]"
 | 
|  |     24 | "comp (Vex a)       = [Load a]"
 | 
|  |     25 | "comp (Bex f e1 e2) = (comp e2) @ (comp e1) @ [Apply f]"
 | 
|  |     26 | end
 |