AjErl Implementando Erlang en C# (1) El proyecto

Hace ya un tiempo, para practicar C# y TDD y explorar ideas de Erlang, inicié:


https://github.com/ajlopez/AjErl


La estructura de la solución:



Tiene el proyecto núcleo de librería de clases, el proyecto de tests, y estoy armando un REPL (Read Eval Print Loop) como programa de consola. Lo interesante de Erlang es que internamente tiene procesos livianos, implementados en la propia máquina virtual, que pueden comunicarse entre sí enviando y recibiendo mensajes inmutables. No pretendo implementar una máquina virtual de ese tipo, sino tener procesos en threads. Nunca van a llegar a ser tan rápidos como los de Erlang, pero es un primer “baby step” a explorar, antes de tratar de mejorar la implementación.


Los mensajes se pueden enviar a una cola por proceso (thread en este caso), y ya tengo implementado la aceptación de los mensajes, su rechazo y vuelta a procesar, como en Erlang nativo.


Pero hoy quería comentar brevemente la implementación de cómo transforma texto de entrada en expresiones y formas Erlang:



Hay un Lexer que devuelve tokens, y estos tokens tienen un valor y un tipo. Ya puedo reconocer un átomo (un nombre que comienza en letra minúscula), una variable, delimitadores, operadores, números enteros y reales, strings. El Lexer es consumido por un Parser, que tiene dos grandes métodos públicos: uno que parsea expresiones, usado desde el REPL, y otro que parsea lo que en Erlang se llama un form, sería como una definición de función en un módulo de Erlang. También hay formas que declaran el nombre del módulo, o que otras formas se exportan con nombre y cantidad de argumentos. En dichos módulos no se aceptan expresiones, sino solamente ese tipo de declaraciones form.


Si ven la historia de los commits, verán que no todo se desarrolló de antemano, sino que fue creciendo de a poco, a medida que me planteaba pequeños casos de uso a implementar.


Próximos temas: comentar la implementación de expresiones, forms, procesos como threads con mailbox para mensajes, y el REPL. Tengo que seguir trabajando en la implementación de mensajes y procesos distribuidos.


Nos leemos!


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

This entry was posted in 1389, 15035, 16845, 18257, 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>