Fix Nim version for Nim 1.0.4
[jackhill/mal.git] / nim / printer.nim
1 import strutils, sequtils, tables, types
2
3 proc str_handle(x: string, pr = true): string =
4 if x.len > 0 and x[0] == '\xff':
5 result = ":" & x[1 .. x.high]
6 elif pr: result = "\"" & x.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n") & "\""
7 else: result = x
8
9 proc pr_str*(m: MalType, pr = true): string =
10 case m.kind
11 of Nil: result = "nil"
12 of True: result = "true"
13 of False: result = "false"
14 of Fun: result = "#<function>"
15 of MalFun: result = "#<malfun>"
16 of Atom: result = "(atom " & m.val.pr_str & ")"
17 of Symbol: result = m.str
18 of String: result = m.str.str_handle(pr)
19 of Number: result = $m.number
20 of List: result = "(" & m.list.mapIt(it.pr_str(pr)).join(" ") & ")"
21 of Vector: result = "[" & m.list.mapIt(it.pr_str(pr)).join(" ") & "]"
22 of HashMap:
23 result = "{"
24 for key, val in m.hash_map.pairs:
25 if result.len > 1: result.add " "
26 result.add key.str_handle & " " & val.pr_str(pr)
27 result.add "}"