anchor.diff:      str (Ident.text_of_id op) ^^ p_atomicTermNotQUident e
     | Op(op, []) ->
       lparen ^^ space ^^ str (Ident.text_of_id op) ^^ space ^^ rparen
  -  | Construct (lid, args) when is_dtuple_constructor lid ->
  -    if all_explicit args
  -    then surround 2 1 (lparen ^^ bar) (separate_map (comma ^^ break1) p_tmEq (List.map fst args)) (bar ^^ rparen)
  -    else
  -    begin match args with
  -      | [] -> p_quident lid
  -      | [arg] -> group (p_quident lid ^/^ p_argTerm arg)
  -      | hd::tl ->
  -          group (
  -              group (prefix2 (p_quident lid) (p_argTerm hd)) ^^
  -                    jump2 (separate_map break1 p_argTerm tl))
  -    end
  -
  +  | Construct (lid, args) when is_dtuple_constructor lid && all1_explicit args ->
  +      surround 2 1 (lparen ^^ bar)
  +        (separate_map (comma ^^ break1) (fun (e, _) -> p_tmEq e) args)
  +                   (bar ^^ rparen)
     | Project (e, lid) ->
       group (prefix 2 0 (p_atomicTermNotQUident e)  (dot ^^ p_qlident lid))
     | _ ->
  
positive.code:   | [] -> true
    | x :: xs -> if f x then all f xs else false
  
  let all_explicit (args:list<(term*imp)>) : bool =
      BU.for_all (function
                  | (_, Nothing) -> true
                  | _ -> false) args
  
negative.code: and p_tmTuple e = with_comment p_tmTuple' e e.range
  
  and p_tmTuple' e = match e.tm with
    | Construct (lid, args) when is_tuple_constructor lid && all1_explicit args ->
        separate_map (comma ^^ break1) (fun (e, _) -> p_tmEq e) args
    | _ -> p_tmEq e
  
  