Lisp - proyectos sencillos para comprenderlo
Llevo un tiempo sin escribir en el blog, las cosas se van complicando y un día por otro, no termino de encontrar esos momentos en los que dedicarme a mí mismo. Este blog es una excusa para cacharrear, experimentar, aprender y satisfacer mi curiosidad. De rebote, por lo que sé, algunas personas, aparte de mí, leen el blog, e incluso algunos encuentran alguna información útil en el caos de los temas que trato. Hoy voy traigo una de las cosas que me hacen procrastinar mucho, mirar las tripas de las cosas. En concreto, las de lisp. Encontré dos proyectos que implementan un lisp sencillo y me puse a repasar el código y ver cómo funcionaban. Uno de los proyectos está escrito en Python y el otro en C/C++.
El primero, el más sencillo, apenas está esbozado un intérprete, sólo admite operaciones aritméticas pero ya nos puede servir para hacernos una idea de qué se necesita para programarte un intérprete de Lisp. El proyecto lo podéis encontrar en:
https://github.com/renatoalencar/lisper
Todo el meollo se encuentra condensado en menos de 500 líneas de código Python.
Por algún sitio, que ahora mismo no encuentro, leí que el autor lo que
pretendía al inicio del proyecto era conseguir con Python la misma
interoperatividad que tiene Clojure con Java. Sin embargo, el
proyecto lleva abandonado dos años y no se ha avanzado en ese
aspecto. Sin embargo, me parece útil, pues se puede apreciar cómo está
implementado de un simple vistazo. Todo el código está dentro del
archivo lisper.py
. Además cuenta con ejemplos, un par de archivos
Lisp que podrían servir también para hacernos una idea de lo que es
capaz de interpretar tan exiguo intérprete.
LispE
LispE es una implementación en C++ de Lisp muy básica. La puedes encontrar en:
https://github.com/naver/lispe
Ahí encontraréis en el About que se presenta el proyecto como:
An implementation of a full fledged Lisp interpreter with Data Structure, Pattern Programming and High level Functions with Lazy Evaluation à la Haskell.
Es decir, que es «una implementación completa de un intérprete Lisp con estructuras de datos, patrones de programación y funciones de alto nivel implementadas con Lazy Evaluation como en Haskell».
El proyecto se llama Lisp Elémentaire o Lisp Elemental. No tiene mucho recorrido en cuanto a librerías, pero sí proporciona algunas funciones bastante interesantes:
- Procesamiento de cadenas
- Funciones matemáticas (exponentes, logaritmos)
- Funciones del sistemas (fecha,
ls
, etc.) - Acceso a red mediante Sockets
- Bases de datos SQLite
- Es multihilo
- Tiene un puente con Python1
- Programación GUI con fltk
- Tiene un editor de código interno que podemos invocar desde el intérprete.
A pesar de su simpleza, permite mucho juego... de hecho llevo una semana arruinando mi productividad jugueteando con esto.
También hay que destacar que el autor se ha esmerado con la documentación y la podemos encontrar en el espacio wiki del proyecto. Encontraremos bastante información sobre la herramienta, sobre Lisp y sobre otros temas interesantes, como pruebas de rendimiento, comparación con otros lenguajes, cómo ampliar librerías en C/C++ para LispE o cómo embeber el intérprete en un programa.
Por supuesto, también cuenta con información sobre todas las funciones
implementadas. Incorpora algunas inspiradas y que les sonarán a los
programadores de Haskell como map
, zip
, filter
, takewhile
...
Conclusiones
Este último proyecto, es el más prometedor, espero que no se detenga y aunque hay señales de estar vivo, veo que en los últimos tiempos los aportes son reducidos.
Ahora mismo no tengo un proyecto en el que se pueda utilizar para probar, pero no estaría mal intentar hacer algo con el intérprete embebido en un ejecutable y hacer lo clásico de disfrazar un Lisp de otra cosa como hacen en Emacs o en AutoCAD.
Footnotes:
Proporciona una librería Python para ejecutar código Lisp y el intérprete de LispE también acepta que le inyectemos código en Python.
Comentarios