// eval part var evaluate = function(x, env) { if (Array.isArray(x)) { var exps = x.map(function(exp) {return evaluate(exp, env);}); var proc = exps.shift(); return proc.apply(null, exps); } else { var y = env[x]; return y !== undefined ? y : x; } }; // library var globalEnv = { '+': function(a, b) {return a + b;}, '-': function(a, b) {return a - b;}, '*': function(a, b) {return a * b;}, '/': function(a, b) {return a / b;}, 'mod': function(a, b) {return a % b;} }; // usage d3.select('#out').text( evaluate(['*', ['+', 1, 2],['-', 8, 3]], globalEnv) );
Result: <span id='out' />