SimpleLisp (2) Compilando Valores y Variables Lisp a JavaScript

Published on Author lopez

Anterior Post

Veamos algo de la implementación del proyecto

https://github.com/ajlopez/SimpleLisp

el compilador de Lisp a JavaScript, escrito en JavaScript, siguiendo el flujo de trabajo de TDD (Test-Driven Development). Todo es “trabajo en progreso” así que lo explico hoy es la implementación actual, de este día, que puede ir cambiando a medida que se vayan implementando nuevos casos de uso.

Tomé la decisión de que cada símbolo de Lisp sea una variable de JavaScript. Así que la compilación de un símbolo queda expresada en este test:

exports['compile symbol'] = function (test) {
    test.equal(sl.compile('a'), 'a');
}

El sl es módulo SimpleLisp que ya tengo cargado con require, al principio de los tests. Este test de arriba lo tomé de test/compile.js

Un entero y un string se compilan a valores naturales en JavaScript:

exports['compile integer'] = function (test) {
    test.equal(sl.compile('42'), '42');
}

exports['compile string'] = function (test) {
    test.equal(sl.compile('"foo"'), '"foo"');
}

También se compilan a valores naturales sus valores “quoted”:

exports['compile quoted integer'] = function (test) {
    test.equal(sl.compile("'42"), '42');
}

exports['compile quoted string'] = function (test) {
    test.equal(sl.compile("'\"foo\""), '"foo"');
}

Decidí tratar a nil como el null de JavaScript. Los valores booleanos se compilan tal cual:

exports['compile nil'] = function (test) {
    test.equal(sl.compile('nil'), 'null');
}

exports['compile booleans'] = function (test) {
    test.strictEqual(sl.compile('false'), 'false');
    test.strictEqual(sl.compile('true'), 'true');
}

¿Pero qué pasa si hay que compilar una serie de expresiones Lisp? Armo una función anónima, la invoco sin parámetros, y devuelvo el valor de la última expresión:

exports['compile two symbols'] = function (test) {
    test.equal(sl.compile('a b'), '(function () { a; return b; })()');
}

Próximos temas: compilación de una lista y de valores quoted más complejos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez