1 if (typeof module
!== 'undefined') {
2 var types
= require('./types');
3 var readline
= require('./node_readline');
4 var reader
= require('./reader');
5 var printer
= require('./printer');
6 var Env
= require('./env').Env
;
11 return reader
.read_str(str
);
15 function eval_ast(ast
, env
) {
16 if (types
._symbol_Q(ast
)) {
18 } else if (types
._list_Q(ast
)) {
19 return ast
.map(function(a
) { return EVAL(a
, env
); });
20 } else if (types
._vector_Q(ast
)) {
21 var v
= ast
.map(function(a
) { return EVAL(a
, env
); });
22 v
.__isvector__
= true;
24 } else if (types
._hash_map_Q(ast
)) {
27 new_hm
[EVAL(k
, env
)] = EVAL(ast
[k
], env
);
35 function _EVAL(ast
, env
) {
36 //printer.println("EVAL:", types._pr_str(ast, true));
37 if (!types
._list_Q(ast
)) {
38 return eval_ast(ast
, env
);
42 var a0
= ast
[0], a1
= ast
[1], a2
= ast
[2], a3
= ast
[3];
45 var res
= EVAL(a2
, env
);
46 return env
.set(a1
, res
);
48 var let_env
= new Env(env
);
49 for (var i
=0; i
< a1
.length
; i
+=2) {
50 let_env
.set(a1
[i
].value
, EVAL(a1
[i
+1], let_env
));
52 return EVAL(a2
, let_env
);
54 var el
= eval_ast(ast
, env
), f
= el
[0];
55 return f
.apply(f
, el
.slice(1));
59 function EVAL(ast
, env
) {
60 var result
= _EVAL(ast
, env
);
61 return (typeof result
!== "undefined") ? result
: null;
66 return printer
._pr_str(exp
, true);
70 var repl_env
= new Env();
71 var rep = function(str
) { return PRINT(EVAL(READ(str
), repl_env
)); };
73 repl_env
.set('+', function(a
,b
){return a
+b
;});
74 repl_env
.set('-', function(a
,b
){return a
-b
;});
75 repl_env
.set('*', function(a
,b
){return a
*b
;});
76 repl_env
.set('/', function(a
,b
){return a
/b
;});
78 if (typeof require
=== 'undefined') {
79 // Asynchronous browser mode
80 readline
.rlwrap(function(line
) { return rep(line
); },
82 if (exc
instanceof reader
.BlankException
) { return; }
83 if (exc
.stack
) { printer
.println(exc
.stack
); }
84 else { printer
.println(exc
); }
86 } else if (require
.main
=== module
) {
87 // Synchronous node.js commandline mode
89 var line
= readline
.readline("user> ");
90 if (line
=== null) { break; }
92 if (line
) { printer
.println(rep(line
)); }
94 if (exc
instanceof reader
.BlankException
) { continue; }
95 if (exc
.stack
) { printer
.println(exc
.stack
); }
96 else { printer
.println(exc
); }