Merge pull request #114 from dubek/equality-pure-mal
[jackhill/mal.git] / js / printer.js
CommitLineData
ea81a808
JM
1// Node vs browser behavior
2var printer = {};
3if (typeof module !== 'undefined') {
4 var types = require('./types');
5 // map output/print to console.log
31b44161
JM
6 printer.println = exports.println = function () {
7 console.log.apply(console, arguments);
8 };
ea81a808
JM
9}
10
11function _pr_str(obj, print_readably) {
12 if (typeof print_readably === 'undefined') { print_readably = true; }
13 var _r = print_readably;
14 var ot = types._obj_type(obj);
15 switch (ot) {
16 case 'list':
17 var ret = obj.map(function(e) { return _pr_str(e,_r); });
18 return "(" + ret.join(' ') + ")";
19 case 'vector':
20 var ret = obj.map(function(e) { return _pr_str(e,_r); });
21 return "[" + ret.join(' ') + "]";
22 case 'hash-map':
23 var ret = [];
24 for (var k in obj) {
25 ret.push(_pr_str(k,_r), _pr_str(obj[k],_r));
26 }
27 return "{" + ret.join(' ') + "}";
28 case 'string':
b8ee29b2
JM
29 if (obj[0] === '\u029e') {
30 return ':' + obj.slice(1);
31 } else if (_r) {
32 return '"' + obj.replace(/\\/g, "\\\\")
31b44161
JM
33 .replace(/"/g, '\\"')
34 .replace(/\n/g, "\\n") + '"'; // string
ea81a808
JM
35 } else {
36 return obj;
37 }
b8ee29b2
JM
38 case 'keyword':
39 return ':' + obj.slice(1);
ea81a808
JM
40 case 'nil':
41 return "nil";
42 case 'atom':
43 return "(atom " + _pr_str(obj.val,_r) + ")";
44 default:
45 return obj.toString();
46 }
47}
48
49exports._pr_str = printer._pr_str = _pr_str;
50