anchor.diff:  
   // changing PPrint's ^//^ to ^/+^ since '//' wouldn't work in F#
   let prefix2 prefix_ body = prefix 2 1 prefix_ body
  +
  +let prefix2_nonempty prefix_ body =
  +  if body = empty then prefix_ else prefix2 prefix_ body
   
   let ( ^/+^ ) prefix_ body = prefix2 prefix_ body
   
  
positive.code:   (* TODO : Should we allow tagging individual constructor with a comment ? *)
    optional p_fsdoc doc_opt ^^ default_or_map uid_doc (fun t -> (group (uid_doc ^^ space ^^ sep)) ^/+^ p_typ false false t) t_opt
  
  and p_letlhs (pat, _) =
    (* TODO : this should be refined when head is an applicative pattern (function definition) *)
    let pat, ascr_doc =
      match pat.pat with
      | PatAscribed (pat, (t, None)) -> pat, break1 ^^ group (colon ^^ space ^^ p_tmArrow p_tmNoEq t)
      | PatAscribed (pat, (t, Some tac)) -> pat, break1 ^^ group (colon ^^ space ^^ p_tmArrow p_tmNoEq t) ^^ group (str "by" ^^ space ^^ p_atomicTerm tac)
      | _ -> pat, empty
    in
    match pat.pat with
    | PatApp ({pat=PatVar (x, _)}, pats) ->
        group (p_lident x ^/^ separate_map_or_flow break1 p_atomicPattern pats ^^ ascr_doc)
    | _ ->
        group (p_tuplePattern pat ^^ ascr_doc)
  
  and p_letbinding (pat, e) =
    let pat_doc = p_letlhs (pat, e) in
    prefix2 (group (pat_doc ^/^ equals)) (p_term false false e)
  
  (* ****************************************************************************)
  (*                                                                            *)
  
negative.code:     (p_fsdocTypeDeclPairs (str "type") (List.hd tcdefs)) ^^
        (concat_map (fun x -> break1 ^^ p_fsdocTypeDeclPairs (str "and") x) <| List.tl tcdefs)
    | TopLevelLet(q, lbs) ->
      let let_doc = str "let" ^^ p_letqualifier q in
      separate_map_with_comments_kw let_doc (str "and") p_letbinding lbs
        (fun (p, t) -> Range.union_ranges p.prange t.range)
    | Val(lid, t) ->
      (str "val" ^^ space ^^ p_lident lid ^^ space ^^ colon) ^/+^ p_typ false false t
  