Makefile: fix recursive make of compiled impls.
[jackhill/mal.git] / js / printer.js
1 // Node vs browser behavior
2 var printer = {};
3 if (typeof module !== 'undefined') {
4 var types = require('./types');
5 // map output/print to console.log
6 printer.println = exports.println = function () {
7 console.log.apply(console, arguments);
8 };
9 }
10
11 function _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':
29 if (obj[0] === '\u029e') {
30 return ':' + obj.slice(1);
31 } else if (_r) {
32 return '"' + obj.replace(/\\/g, "\\\\")
33 .replace(/"/g, '\\"')
34 .replace(/\n/g, "\\n") + '"'; // string
35 } else {
36 return obj;
37 }
38 case 'keyword':
39 return ':' + obj.slice(1);
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
49 exports._pr_str = printer._pr_str = _pr_str;
50