anchor.diff:                                  else let x = gensym () in
                                        (x, arg)::lbs, (with_ty arg.ty <| MLE_Var x)::out_args)
                           ([], []) mlargs_f in
  -                    let app = maybe_lalloc_eta_data g is_data t <| (with_ty t <| MLE_App(mlhead, mlargs)) in
  +                    let app = maybe_eta_data_and_project_record g is_data t <| (with_ty t <| MLE_App(mlhead, mlargs)) in
                       let l_app = List.fold_right 
                           (fun (x, arg) out -> 
                               with_ty out.ty <| MLE_Let((false, [{mllb_name=x; mllb_tysc=Some ([], arg.ty); mllb_add_unit=false; mllb_def=arg}]), 
  
positive.code: 
  let unit_binder = S.mk_binder <| S.new_bv None TypeChecker.Common.t_unit
  
  (*INVARIANT: we MUST always perform deep erasure after extraction of types, even when done indirectly e.g. translate_typ_of_arg below.
    Otherwise, there will be Ob.magic because the types get erased at some places and not at other places *)
  //let translate_typ (g:env) (t:typ) : mlty = eraseTypeDeep g (TypeExtraction.ext g t)
  
negative.code: 
  (* something is a value iff it qualifies for the OCaml's "value restriction", 
     which determines when a definition can be generalized *)
  let rec is_fstar_value (t:term) =   
      match (SS.compress t).n with
      | Tm_constant _
      | Tm_bvar _
  