anchor.diff:              | :? System.NotSupportedException -> true) //for dynamic assemblies, just assume idiomatic generic value
   
   //suprisingly, this is actually used twice.
  -///test whether the Expr is a Var and equals the given Var property-wise
  +///Test whether the Expr is a Var and equals the given Var property-wise
   let varEqualsExpr (x:Var) = function
       | Var y -> x.Name = y.Name && x.Type = y.Type && x.IsMutable = y.IsMutable
       | _ -> false
   
  +///Test whether the given expression represents a tuple let binding: e.g. let x,y = 1,2.
  +///Must come before Let pattern and after IncompleteLambdaCall pattern.
   let (|TupleLet|_|) x =
       ///TupleLet start variation 1) let a = TupleGet(tupleProperty, index) in let b = TupleGet(tupleProperty, index) in ...
       let (|TupleLetStart1|_|) = function
  
positive.code:     ] |> Map.ofList
  
  //future feature, support custom ops
  let (|BinaryInfixCall|_|) = function
      | Call (_, mi, lhs::rhs::[]) ->
          match binaryOps |> Map.tryFind mi.Name with
  
negative.code: //todo:
  //  precedence applied to lhs of . not right, see skipped SourceOpTests
  //  note: Dictionary<_,_> values are not sprinted as nicely as in FSI, consider using FSI style
  let sprint expr =
      let rec sprint context expr =
          let applyParens = applyParensForPrecInContext context
  