Merge pull request #358 from bjh21/bjh21-extra-tests
[jackhill/mal.git] / scala / printer.scala
1 import types.{MalList, MalVector, MalHashMap, MalFunction}
2
3
4 object printer {
5 def _pr_str(obj: Any, print_readably: Boolean = true): String = {
6 val _r = print_readably
7 return obj match {
8 case v: MalVector => v.toString(_r)
9 case l: MalList => l.toString(_r)
10 case hm: MalHashMap => hm.toString(_r)
11 case s: String => {
12 if (s.length > 0 && s(0) == '\u029e') {
13 ":" + s.substring(1,s.length)
14 } else if (_r) {
15 //println("here1: " + s)
16 "\"" + s.replace("\\", "\\\\")
17 .replace("\"", "\\\"")
18 .replace("\n", "\\n") + "\""
19 } else {
20 s
21 }
22 }
23 case Symbol(s) => s
24 case a: types.Atom => "(atom " + a.value + ")"
25 case null => "nil"
26 case _ => {
27 if (obj.isInstanceOf[MalFunction]) {
28 val f = obj.asInstanceOf[MalFunction]
29 "<function (fn* " + _pr_str(f.params) + " " + _pr_str(f.ast) + ")>"
30 } else {
31 obj.toString
32 }
33 }
34 }
35 }
36
37 def _pr_list(lst: List[Any], print_readably: Boolean = true,
38 sep: String = " "): String = {
39 lst.map{_pr_str(_, print_readably)}.mkString(sep)
40 }
41 }
42
43 // vim: ts=2:sw=2