Merge branch 'master' into issue_166_string_ops
[jackhill/mal.git] / es6 / printer.js
CommitLineData
4f8c7db9 1import { _symbol, _symbol_Q, _list_Q, _vector_Q, _hash_map_Q, Atom } from './types'
4eb71990
JM
2
3export function pr_str(obj, print_readably) {
4f8c7db9
JM
4 if (typeof print_readably === 'undefined') { print_readably = true }
5 var _r = print_readably
afa79313 6 if (_list_Q(obj)) {
4f8c7db9
JM
7 var ret = obj.map(function(e) { return pr_str(e,_r) })
8 return "(" + ret.join(' ') + ")"
afa79313 9 } else if (_vector_Q(obj)) {
4f8c7db9
JM
10 var ret = obj.map(function(e) { return pr_str(e,_r) })
11 return "[" + ret.join(' ') + "]"
afa79313 12 } else if (_hash_map_Q(obj)) {
4f8c7db9 13 var ret = []
afa79313 14 for (let [k,v] of obj) {
4f8c7db9 15 ret.push(pr_str(k,_r), pr_str(v,_r))
afa79313 16 }
4f8c7db9 17 return "{" + ret.join(' ') + "}"
4eb71990
JM
18 } else if (typeof obj === "string") {
19 if (obj[0] === '\u029e') {
4f8c7db9 20 return ':' + obj.slice(1)
4eb71990
JM
21 } else if (_r) {
22 return '"' + obj.replace(/\\/g, "\\\\")
23 .replace(/"/g, '\\"')
4f8c7db9 24 .replace(/\n/g, "\\n") + '"' // string
4eb71990 25 } else {
4f8c7db9 26 return obj
4eb71990 27 }
4f8c7db9
JM
28 } else if (_symbol_Q(obj)) {
29 return Symbol.keyFor(obj)
4eb71990 30 } else if (obj === null) {
4f8c7db9 31 return "nil"
e5c4e656 32 } else if (obj instanceof Atom) {
4f8c7db9 33 return "(atom " + pr_str(obj.val,_r) + ")"
4eb71990 34 } else {
4f8c7db9 35 return obj.toString()
4eb71990
JM
36 }
37}