anchor.diff:              | TryFinally _ as tryFinallyExpr ->
                   stack.Push(CompileTarget (Expr.Application(Expr.Lambda(Var("unitVar", typeof<unit>), tryFinallyExpr), <@ () @>)))
               | Let (var, expr, body) ->
  -                stack.Push(Compiling (fun _ ->
  -                  varEnv := (!varEnv).Tail
  -                ))
  +                let assumptionOpt = tryPopAssumption stack
  +                pushTearDown assumptionOpt (fun _ -> varEnv := (!varEnv).Tail) stack
                   stack.Push(CompileTarget body)
                   let local = gen.DeclareLocal(var.Name, var.Type)
                   stack.Push(Compiling (fun gen -> gen.Emit(ILOpCode.stloc local var.Name)))
  
positive.code:                 ))
                  stack.Push(CompileTarget expr)
              | LetRecursive (varAndExprList, body) ->
                  stack.Push(Compiling (fun _ ->
                    varEnv := (!varEnv) |> Seq.skip varAndExprList.Length |> Seq.toList
                  ))
                  stack.Push(CompileTarget body)
                  for var, expr in varAndExprList do
                    let local = gen.DeclareLocal(var.Name, var.Type)
  
negative.code:                 let falseLabel = gen.DefineLabel()
                  let ifEndLabel = gen.DefineLabel()
  
                  let assumptionOpt = tryPopAssumption stack
                  pushTearDown assumptionOpt (fun gen -> gen.MarkLabel(ifEndLabel)) stack
                  stack.Push(CompileTarget falsePart)
                  pushTearDown assumptionOpt (fun gen -> gen.Emit(Br ifEndLabel); gen.MarkLabel(falseLabel)) stack
                  stack.Push(CompileTarget truePart)
                  stack.Push(Compiling (fun gen ->
                    gen.Emit(Brfalse falseLabel)
  