aboutsummaryrefslogtreecommitdiff
path: root/go/src/printer
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2015-03-02 21:33:10 -0600
committerJoel Martin <github@martintribe.org>2015-03-02 21:33:10 -0600
commit835fb7d8b06e2b44792a97ac89994658bf6d00af (patch)
tree578f67726ab9e3ce5fcbc50220e9761a66c5ddf1 /go/src/printer
parent6b72e6078a7d505ecf9d711eb4a16fc4dfac36b6 (diff)
parent8a98ef9a3f3a6b6d05d02dc305a0c886c907e0f3 (diff)
downloadmal-835fb7d8b06e2b44792a97ac89994658bf6d00af.tar.gz
mal-835fb7d8b06e2b44792a97ac89994658bf6d00af.zip
Merge branch 'master' into gh-pages
Conflicts: .gitignore
Diffstat (limited to 'go/src/printer')
-rw-r--r--go/src/printer/printer.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/go/src/printer/printer.go b/go/src/printer/printer.go
new file mode 100644
index 0000000..1b8e9fe
--- /dev/null
+++ b/go/src/printer/printer.go
@@ -0,0 +1,62 @@
+package printer
+
+import (
+ "fmt"
+ "strings"
+)
+
+import (
+ "types"
+)
+
+func Pr_list(lst []types.MalType, pr bool,
+ start string, end string, join string) string {
+ str_list := make([]string, 0, len(lst))
+ for _, e := range lst {
+ str_list = append(str_list, Pr_str(e, pr))
+ }
+ return start + strings.Join(str_list, join) + end
+}
+
+func Pr_str(obj types.MalType, print_readably bool) string {
+ switch tobj := obj.(type) {
+ case types.List:
+ return Pr_list(tobj.Val, print_readably, "(", ")", " ")
+ case types.Vector:
+ return Pr_list(tobj.Val, print_readably, "[", "]", " ")
+ case types.HashMap:
+ str_list := make([]string, 0, len(tobj.Val)*2)
+ for k, v := range tobj.Val {
+ str_list = append(str_list, Pr_str(k, print_readably))
+ str_list = append(str_list, Pr_str(v, print_readably))
+ }
+ return "{" + strings.Join(str_list, " ") + "}"
+ case string:
+ if strings.HasPrefix(tobj, "\u029e") {
+ return ":" + tobj[2:len(tobj)]
+ } else if print_readably {
+ return `"` + strings.Replace(
+ strings.Replace(
+ strings.Replace(tobj,`\`,`\\`, -1),
+ `"`, `\"`, -1),
+ "\n", `\n`, -1) + `"`
+ } else {
+ return tobj
+ }
+ case types.Symbol:
+ return tobj.Val
+ case nil:
+ return "nil"
+ case types.MalFunc:
+ return "(fn* " +
+ Pr_str(tobj.Params, true) + " " +
+ Pr_str(tobj.Exp, true) + ")"
+ case func([]types.MalType)(types.MalType, error):
+ return fmt.Sprintf("<function %v>", obj)
+ case *types.Atom:
+ return "(atom " +
+ Pr_str(tobj.Val, true) + ")"
+ default:
+ return fmt.Sprintf("%v", obj)
+ }
+}