anchor.diff:                  let! (strName, strType, strCode) as str = declareStringConstant stringToPrint
                   let! regName = freshReg
                   let! (loadedStringName, loadedStringType, loadCode) = genLoadString regName str
  -                //do! append (sprintf "call i32 @puts(%s %s)\n" loadedStringType loadedStringName)
                   let putsCode = sprintf "call i32 @puts(%s %s)" loadedStringType loadedStringName
                   let fullString = sprintf "%s\n%s" loadCode putsCode
                   return ("","", fullString)
  
positive.code: 
                // calculate a pointer to the element to assign to elem
                let! curElemReg = freshReg
                let! (curElemName, curElemType, curElemCode) = newRegister curElemReg (sprintf "%s*" (genType elemType)) (sprintf "getelementptr %s %s, i32 0, %s %s" listType listName loadedCounterType loadedCounterName)
  
                // load the pointer to the value
                let! loadedElemReg = freshReg
  
negative.code:           }
          | BinOperation (lhs, op, rhs) -> 
            state {
                let! (sLhsName, sLhsType, lhsCode) = internalCodeGen lhs
                let! (sRhsName, sRhsType, rhsCode) = internalCodeGen rhs
                let! tempReg = freshReg
                let (code, targetType) = 
                    match op, sLhsType with
                    | Multiply, "i64" -> 
                      sprintf "mul %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Multiply, "double" -> 
                      sprintf "fmul %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Modulo, "i64" -> 
                      sprintf "srem %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Modulo, "double" -> 
                      sprintf "frem %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Plus, "i64" ->
                      sprintf "add %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Plus, "double" ->
                      sprintf "fadd %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Minus, "i64" ->
                      sprintf "sub %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Minus, "double" ->
                      sprintf "fsub %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Divide, "i64" ->
                      sprintf "sdiv %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
                    | Divide, "double" ->
                      sprintf "fdiv %s %s, %s" sLhsType sLhsName sRhsName, sLhsType
  