DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / es6 / printer.mjs
CommitLineData
a11a0235 1import { _list_Q, _keyword_Q, Vector, 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)) {
a05c086f
JM
7 return "(" + obj.map(e => pr_str(e,_r)).join(' ') + ")"
8 } else if (obj instanceof Vector) {
9 return "[" + obj.map(e => pr_str(e,_r)).join(' ') + "]"
10 } else if (obj instanceof Map) {
4f8c7db9 11 var ret = []
afa79313 12 for (let [k,v] of obj) {
4f8c7db9 13 ret.push(pr_str(k,_r), pr_str(v,_r))
afa79313 14 }
4f8c7db9 15 return "{" + ret.join(' ') + "}"
4eb71990 16 } else if (typeof obj === "string") {
a11a0235 17 if (_keyword_Q(obj)) {
4f8c7db9 18 return ':' + obj.slice(1)
4eb71990
JM
19 } else if (_r) {
20 return '"' + obj.replace(/\\/g, "\\\\")
a05c086f
JM
21 .replace(/"/g, '\\"')
22 .replace(/\n/g, "\\n") + '"'
4eb71990 23 } else {
4f8c7db9 24 return obj
4eb71990 25 }
a05c086f 26 } else if (typeof obj === 'symbol') {
4f8c7db9 27 return Symbol.keyFor(obj)
4eb71990 28 } else if (obj === null) {
4f8c7db9 29 return "nil"
e5c4e656 30 } else if (obj instanceof Atom) {
4f8c7db9 31 return "(atom " + pr_str(obj.val,_r) + ")"
4eb71990 32 } else {
4f8c7db9 33 return obj.toString()
4eb71990
JM
34 }
35}