ref: dc596842d658ab664a025d4e98c89b50cac465c4
dir: /printer.ml/
module T = Types.Types let meta obj = match obj with | T.List { T.value = _; T.meta } -> meta | T.Proc { T.value = _; T.meta } -> meta | T.Symbol { T.value = _; T.meta } -> meta | T.Vector { T.value = _; T.meta } -> meta | T.Record { T.value = _; T.meta } -> meta | _ -> T.Nil ;; let rec print obj readable = let r = readable in match obj with | T.Bool true -> "#t" | T.Bool false -> "#f" | T.Char c -> "#\\" ^ Char.escaped c | T.Nil -> "nil" | T.Macro { T.value = xs; T.meta = _ } -> "#<macro>" ^ print xs r | T.Map { T.value = xs; T.meta = _ } -> "{" ^ Types.M9map.fold (fun k v s -> s ^ (if s = "" then "" else " ") ^ print k r ^ " " ^ print v r) xs "" ^ "}" | T.Unspecified -> "#unspecified" | T.Eof_object -> "#eof" (* | T.Pair ({ T.value = one }, { T.value = two }) -> "(" ^ (print one readable) ^ " . " ^ (print two readable) ^ ")" *) | T.Proc _ -> "#<proc>" | T.Symbol { T.value = s; T.meta = _ } -> s | T.Bytevector _ -> "<bytevector unsupported>" | T.Number n -> if Types.is_float n.value then string_of_float n.value else string_of_int (int_of_float n.value) | T.Port _ -> "<port unsupported>" | T.String s -> if r then "\"" ^ Utils.gsub (Str.regexp "\\([\"\\\n]\\)") (function | "\n" -> "\\n" | x -> "\\" ^ x) s ^ "\"" else s | T.List { T.value = xs; T.meta = _ } -> "(" ^ stringify xs r ^ ")" | T.Vector { T.value = v; T.meta = _ } -> "#(" ^ stringify v r ^ ")" | T.Record _ -> "<record unsupported>" and stringify obj human = String.concat " " (List.filter (function | T.Unspecified | T.Eof_object -> human | _ -> true) obj |> List.map (fun s -> print s human)) ;; let dump obj = String.concat " " (List.map (fun s -> print s true) obj)