slisp: un compilador sencillo de Lisp a ensamblador para Linux/AMD64

Fuentes: slisp: a simple Lisp compiler targeting Linux/AMD64 assembly

slisp es un compilador de Lisp escrito en Go que traduce programas Lisp a ensamblador autónomo para plataformas Linux sobre AMD64. El nombre del proyecto admite dos lecturas: «Simple Lisp» (Lisp sencillo) o «Steve's Lisp» (el Lisp de Steve), según prefiera el lector. El repositorio, alojado en GitHub bajo la cuenta skx, nace como evolución de s-lang, un compilador previo del mismo autor que mezclaba enteros, flotantes y cadenas mediante marcas en los bits bajos de los valores; al complicarse el modelo de tipos, el desarrollador decidió empezar de cero con un lenguaje de sintaxis trivial de parsear, tipado consistente desde la base y que respetara la ABI SysV en lugar de una convención propia.

El flujo de uso es directo: con go build . se compila el compilador; ./slisp ejemplo.lisp > ejemplo.s genera el ensamblador; nasm -f elf64 ejemplo.s lo ensambla y ld -o ejemplo ejemplo.o lo enlaza, produciendo un binario nativo listo para ejecutarse. Un Makefile automatiza todo el proceso. Por defecto, slisp antepone a cada programa una biblioteca estándar escrita en el propio lenguaje, que ofrece impresión de tipos conocidos, map, length, gestión de memoria mediante un asignador bump para celdas cons y funciones de detección de tipo en tiempo de ejecución como int? o cons?. Soporta enlaces, funciones, enteros, cadenas, lambdas con cierres y listas, e incluye operaciones aritméticas (+, -, *, /, %) y comparaciones (=, <, <=, >=, >, !).

Entre los ejemplos destaca un intérprete de Brainfuck implementado en slisp, además de pruebas funcionales situadas en el directorio test/ que comparan la salida de programas fijos con resultados válidos. El proyecto incorpora además pruebas Go estándar (go test ./...) y compatibilidad con fuzz-testing del propio lenguaje Go, ejecutable durante cinco minutos con go test -fuzztime=300s -parallel=1 -fuzz=FuzzProject -v.

El autor es claro respecto a sus limitaciones: no hay recolección de basura, no hay macros y no hay quote ni quasiquote. Reconoce que añadir estas características sería viable, pero costosa sin esas primitivas. En conjunto, slisp se presenta como una herramienta didáctica y experimental orientada al aprendizaje personal del autor, más que como un entorno de producción.