Not sure what this proves exactly. For fun, here's a Javascript equivalent in 27, err, "lines":<p><pre><code> module.exports = function() {
var atom = function(val) { return val instanceof Array ? false : true; };
var env = {
label: function(sexpr, senv) { senv[sexpr[1]] = evaluate( sexpr[2] ); },
quote: function(sexpr, senv) { return sexpr[1]; },
"==": function(sexpr, senv) { return evaluate(sexpr[1], senv) == evaluate(sexpr[2], senv); },
head: function(sexpr, senv) { return evaluate(sexpr[1], senv)[0]; },
tail: function(sexpr, senv) { return evaluate(sexpr[1], senv).slice(1); },
conc: function(sexpr, senv) { return [evaluate(sexpr[1])].concat(evaluate(sexpr[2])); },
"if": function(sexpr, senv) { return evaluate(sexpr[1], senv) ? evaluate(sexpr[2], senv) : evaluate(sexpr[3], senv); },
atom: function(sexpr, senv) { return atom(sexpr[1]); },
lambda: function(sexpr, senv) {
return function(lexpr, lenv) {
for(var i=0; i<sexpr[1].length; ++i) lenv[sexpr[1][i]] = evaluate(lexpr[i+1], lenv);
return evaluate(sexpr[2], lenv);
};
}
};
var evaluate = function(sexpr, senv) {
senv = senv || env;
if( atom(sexpr) ) return senv[sexpr] !== undefined ? senv[sexpr] : sexpr;
else return senv[sexpr[0]](sexpr, senv);
};
this.evaluate = evaluate;
};
</code></pre>
Example:<p><pre><code> var notlisp = require("./notlisp.js");
var l = new notlisp();
l.evaluate( ["label", "second", ["lambda", ["x"], ["head", ["tail", "x"]]]] );
l.evaluate( ["second", ["quote", [1, 2, 3]] ] );</code></pre>