ClojSharp Implementando Clojure en C# (1) El Proyecto

Desde la década pasada que me interesa Clojure, y desde siempre Lisp. Clojure está implementando sobre la máquina virtual de Java, pero también está implementado sobre .NET (que recuerde, usando Dynamic Language Runtime). La versión de Java compila a bytecodes Java. También hay una versión para JavaScript, llamada ClojureScript. La comunidad es muy activa, y ha traido un aire de renovación dentro de Java. Tiene características como la inmutabilidad de sus estructuras orientadas al trabajo en múltiples hilos evitando los problemas de lockeo y concurrencia. Tiene Software Transactional Memory, usando refs y transacciones,  pero ha sido menos usada por lo que veo. Han surgido frameworks web, y tiene un manejador de proyectos y dependencias Leiningen muy bien armado. Algunos enlaces en mis posts de Clojure.

Para practicar TDD (Test-Driven Development) y C#, he estado armando un intérprete (no un compilador a bytecodes), en .NET. Ver el proyecto en:

https://github.com/ajlopez/ClojSharp

El estado actual:

Tiene una librería de clases, otra de tests, y ya apareció un REPL (Read Eval Print Loop) sencillo como programa de consola.

En Lisp, una expresión se compone de un verbo y argumentos, expresados en una lista entre paréntesis. Por ejemplo una lista que al evaluarse devuelve la suma de 1, 2 y 3:

(+ 1 2 3)


Acá + (el signo más) es un símbolo que apunta a lo que en Lisp se llama una form, algo que recibe argumentos, opera con ellos y devuelve un resultado. Los argumentos que recibe un form en general se evalúan antes de serle entregados:



(+ 1 (- 3 4) 3)


Acá el primer argumento es una constante que vale uno, y el segundo argumento, antes de llegar al form de suma, ya es evaluado y vale –1 (menos uno). Pero hay forms que no necesitan evaluar los argumentos. Los reciben, digamos, en crudo. Se llaman special forms. Tengo implementados:





Y también tengo implementadas algunas forms (no especiales) como primitivas en C#. Muchas podrían ser implementadas en Lisp mismo, pero por ser tan básicas las implementé directamente en C#, usando TDD como es usual:





Próximos temas: la implementación de Machine, el Context, como se usa Parser y Lexer, más sobre evaluación de expresiones. Y mil temas más, como estructuras inmutables, macros, recursión optimizada, etc.



Nos leemos!



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

This entry was posted in 10754, 11699, 1389, 15035, 18258, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>