anchor.diff:          onEnterFunction: Env -> Stmt -> Env
       }
       with
  -        static member Create(reusableNames, allowOverloading, newName, onEnterFunction) = {
  +        static member Create(availableNames, allowOverloading, newName, onEnterFunction) = {
               varRenames = Map.empty
  -            nextID = 0
               funRenames = Map.empty
  -            reusableNames = reusableNames
  +            availableNames = availableNames
               allowOverloading = allowOverloading
               newName = newName
               onEnterFunction = onEnterFunction
  
positive.code:         varRenames: Map<Ident, Ident>
          // Map from a new function name and function arity to the old name.
          funRenames: Map<Ident, Map<int, Ident>>
          // List of names that are still available after having been used before.
          reusableNames: Ident list
  
          // Used only for optimizeFrequency.
          nextID: int
  
          // Whether multiple functions can have the same name (but different arity).
          allowOverloading: bool
  
negative.code:         let env = {env with varRenames = Map.add id newName env.varRenames}
          env, newName
  
      // FIXME: handle 2-letter names
      let optimizeContext contextTable env id =
          let cid = char (1000 + int id)
          let newName = chooseIdent contextTable cid env.availableNames
          let l = env.availableNames |> List.filter (fun x -> x <> newName)
          {env with varRenames = Map.add id newName env.varRenames; availableNames = l}, newName
  
      let dontRename env name =
          let names = env.availableNames |> List.filter ((<>) name)
          {env with varRenames = env.varRenames.Add(name, name); availableNames = names}
  
      let dontRenameList env names =
          let mutable env = env
  