(define jslambda (jsspform "function(source) { var fn = eval('(' + source + ')'); var fw = function() { var args = []; for (var i = 0; i < arguments.length; i ++) args.push(arguments[i].eval(this)); return fn.apply(this, args); }; fw.ctx = this.saveScope(); return fw; }")) (define if (jsspform "function(cond, t, f) { var r; if(cond.eval(this)) { r = t.eval(this); } else { r = f.eval(this) } return r; }")) (define set! (jsspform "function(symbol, from, to) { this.set(symbol, value.eval(this)); return 0; }")) (define lambda (jsspform "function() { var args = Array.shift(arguments); var exprs = arguments; var f = function() { for (var i = 0; i < args.length; i ++) this.define(args[i], arguments[i]); var r; for (var i = 0; i < exprs.length; i++) { r = exprs[i].eval(this); } return r; }; f.ctx = this.saveScope(); return f; }")) (define let (jsspform "function() { var argPairs = Array.shift(arguments); var exprs = arguments; var ps = []; var vs = []; for (var i = 0; i < argPairs.length; i ++) { ps.push(argPairs[i][0]); vs.push(argPairs[i][1]); } var lambdaSpform = this.resolve(new Symbol('lambda')); Array.unshift(exprs, ps); var fn = lambdaSpform.eval(this, exprs); var list = [fn].concat(vs) return list.eval(this); }")) (define begin (jslambda "function() { return arguments[arguments.length - 1]; }")) (define + (jslambda "function() { var result = arguments[0]; for (var i = 1; i < arguments.length; i ++) result += arguments[i]; return result }")) (define - (jslambda "function() { var result = arguments[0]; for (var i = 1; i < arguments.length; i ++) result -= arguments[i]; return result }")) (define / (jslambda "function() { var result = arguments[0]; for (var i = 1; i < arguments.length; i ++) result /= arguments[i]; return result }")) (define * (jslambda "function() { var result = arguments[0]; for (var i = 1; i < arguments.length; i ++) result *= arguments[i]; return result }")) (define = (jslambda "function(a, b) { return (a == b) ? 1 : 0 }")) (define < (jslambda "function(a, b) { return (a < b) ? 1 : 0 }")) (define > (jslambda "function(a, b) { return (a > b) ? 1 : 0 }")) (define expt (jslambda "function(a, b) { return Math.pow(a, b) }")) (define or (jslambda "function(a, b) { return (a || b) ? 1 : 0 }")) (define and (jslambda "function(a, b) { return (a && b) ? 1 : 0 }")) (define display (jslambda "function(a) { document.getElementById('log').appendChild(document.createTextNode(a + '\n')); return a; }"))