anchor.diff:  
   (* Prepares the given program for C code generation *)
   let cpreprocess (e: Expr): Expr = 
  -  anfConversion false (letLifting (closureConversion (optimize e)))
  +  letLifting (anfConversion false (closureConversion (optimize e)))
   
   (* The entry point for the compiler which invokes different phases and code generators *)
   let compile (moduleName: string) (methodName: string): string = 
  
positive.code:   | Patterns.Lambda (x, body) -> Expr.Lambda(x, anfConversion false body)
    | Patterns.NewArray(tp, elems) when not letRhs -> 
      let variable = new Var(newVar "array", e.Type)
      (* TODO perform ANF conversion for the arguments as well *)
      Expr.Let(variable, e, Expr.Var(variable))
    | Patterns.IfThenElse(cond, e1, e2) when not letRhs ->
      let variable = new Var(newVar "ite", e.Type)
      Expr.Let(variable, Expr.IfThenElse(cond, anfConversion false e1, anfConversion false e2), Expr.Var(variable))
  
negative.code:     | LambdaN (inputs, body) ->
        let (te, ll) = constructTopLevelLets boundVars body
        (LambdaN (inputs, te), ll)
      | Patterns.IfThenElse(cond, e1, e2) ->
        let (te1, liftedLets1) = constructTopLevelLets boundVars e1
        let (te2, liftedLets2) = constructTopLevelLets boundVars e2
        let (tc, liftedLetsc) = constructTopLevelLets boundVars cond
        (Expr.IfThenElse(tc, LetN(liftedLets1, te1), LetN(liftedLets2, te2)), liftedLetsc)
      | ExprShape.ShapeCombination(o, exprs) ->
        let (tes, lls) = List.unzip (List.map (constructTopLevelLets boundVars) exprs)
        (ExprShape.RebuildShapeCombination(o, tes), List.concat lls)
      | _ -> (exp, [])
    let (inputs, body) = match e with TopLevelFunction (i, b) -> (i, b)
    let (te, ll) = constructTopLevelLets inputs body
  