Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function eval(x, env){
- env = env || global_env;
- if (typeof x == 'string')
- return env.find(x.valueOf())[x.valueOf()];
- else if (typeof x == 'number')
- return x;
- else if (x[0] == 'quote')
- return x[1];
- else if (x[0] == 'if'){
- var test = x[1], conseq = x[2], alt = x[3];
- if (eval(test, env))
- return eval(conseq, env);
- else
- return eval(alt, env);
- }
- else if (x[0] == 'set!')
- env.find(x[1])[x[1]] = eval(x[2], env);
- else if (x[0] == 'define')
- env[x[1]] = eval(x[2], env);
- else if (x[0] == 'lambda'){
- var vars = x[1], exp = x[2];
- return function(){
- return eval(exp, Env({parms: vars, args: arguments, outer: env}));
- };
- }
- else if (x[0] == 'begin'){
- var val;
- for (var i = 0; i < x.length; i += 1)
- val = eval(x[i], env);
- return val;
- }
- else{
- var exps = [];
- for (i = 0; i < x.length; i += 1)
- exps[i] = eval(x[i], env);
- var proc = exps.shift();
- return proc.apply(env, exps);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement