Merge pull request #306 from kanaka/add-predicates
[jackhill/mal.git] / ocaml / printer.ml
1 module T = Types.Types
2
3 let meta obj =
4 match obj with
5 | T.List { T.meta = meta } -> meta
6 | T.Map { T.meta = meta } -> meta
7 | T.Vector { T.meta = meta } -> meta
8 | T.Symbol { T.meta = meta } -> meta
9 | T.Fn { T.meta = meta } -> meta
10 | _ -> T.Nil
11
12 let rec pr_str mal_obj print_readably =
13 let r = print_readably in
14 match mal_obj with
15 | T.Int i -> string_of_int i
16 | T.Symbol { T.value = s } -> s
17 | T.Keyword s -> ":" ^ s
18 | T.Nil -> "nil"
19 | T.Bool true -> "true"
20 | T.Bool false -> "false"
21 | T.String s ->
22 if r
23 then "\"" ^ (Reader.gsub (Str.regexp "\\([\"\\\n]\\)")
24 (function
25 | "\n" -> "\\n"
26 | x -> "\\" ^ x)
27 s) ^ "\""
28 else s
29 | T.List { T.value = xs } ->
30 "(" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ ")"
31 | T.Vector { T.value = xs } ->
32 "[" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ "]"
33 | T.Map { T.value = xs } ->
34 "{" ^ (Types.MalMap.fold (fun k v s -> s ^ (if s = "" then "" else " ") ^ (pr_str k r)
35 ^ " " ^ (pr_str v r)) xs "")
36 ^ "}"
37 | T.Fn f -> "#<fn>"
38 | T.Atom x -> "(atom " ^ (pr_str !x r) ^ ")"