let rec print_term v = match v.term with
| Unit -> "()"
| Bool i -> string_of_bool i
| Int i -> string_of_int i
| Float f -> string_of_float f
| String s -> Printf.sprintf "%S" s
| Encoder e -> Encoder.string_of_format e
| List l ->
"["^(String.concat ", " (List.map print_term l))^"]"
| Product (a,b) ->
Printf.sprintf "(%s,%s)" (print_term a) (print_term b)
| Ref a ->
Printf.sprintf "ref(%s)" (print_term a)
| Fun (_,[],v) when is_ground v -> "{"^(print_term v)^"}"
| Fun _ -> "<fun>"
| Var s -> s
| App (hd,tl) ->
let tl =
List.map
(fun (lbl,v) -> (if lbl="" then "" else lbl^"=")^(print_term v))
tl
in
(print_term hd)^"("^(String.concat "," tl)^")"
| Let _ | Seq _ | Get _ | Set _ -> assert false