anchor.diff:          let ctx = { ctx with TailCallOpportunity = None }
           let bodyExpr = com.TransformAsExpr(ctx, body)
           mkTryBlockExpr bodyExpr // TODO: add catch and finally
  +
       let transformCurriedApply com ctx range expr args =
           callFunction range expr (args |> List.map (transformAsExpr com ctx))
           // let handler =
  
positive.code:         //     else iife com ctx expr
  
          | Fable.Sequential exprs ->
              exprs
              |> List.map (fun e ->
                  com.TransformAsExpr(ctx, e)
                  |> (if e.Type = Fable.Unit then mkSemiStmt else mkExprStmt))
              |> mkBlock
              |> mkBlockExpr
  
          | Fable.Emit(info, _, range) ->
              // if info.IsJsStatement then iife com ctx expr
  
negative.code:             transformSet com ctx range expr typ value kind
  
          | Fable.Let(ident, value, body) ->
              // flatten nested let binding expressions
              let rec flatten acc expr =
                  match expr with
                  | Fable.Let(ident, value, body) ->
                      flatten ((ident, value)::acc) body
                  | _ -> List.rev acc, expr
              let bindings, body = flatten [] fableExpr
              transformLet com ctx bindings body
              // if ctx.HoistVars [ident] then
              //     let assignment = transformBindingAsExpr com ctx ident value
              //     Expression.sequenceExpression([|assignment; com.TransformAsExpr(ctx, body)|])
  