Este fin de semana, estuve trabajando en un intérprete Logo escrito en Javascript. Este es mi proyecto de código abierto eb:
https://github.com/ajlopez/AjLogoJs
Mi principal referencia del lenguaje fue el manuel de Berkeley:
http://www.cs.berkeley.edu/~bh/usermanual
Probé algunas expresiones en estas implementaciones en línea, también escritas en BLOCKED SCRIPT
http://logo.twentygototen.org/
http://www.calormen.com/Logo/
Sólo ejecuté expresiones, sin fijarme en el código de implementación. Prefiero primero escribir mi propia implementación, usando TDD en el proceso, desde cero, sin estar influido por alguna implementación anterior. El intérprete que escribí puede ejecutarse en el navegador y también en un servidor Node.js. En algún momento, podría agregar algún ejemplo del lado del servidor.
Inicialmente, pensé que necesitaba implementar un objeto List, pero los arreglos de Javascript fueron lo suficientemente buenos para implementar las listas de Logo. Durante la codificación, me dí cuenta que Javascript es un muy buen lenguaje de implementación para un intérprete Logo. Por ejemplo, Logo tiene una conducta interesante. Algo como:
print myproc 1 2 myotherproc 3 4
podría ser interpretado de diferentes maneras, dependiendo de la cantidad de parámetros que espera myproc o myotherproc. Cuando implementé procedimientos Logo primitivos como print, sum, make, etc… como funciones Javascript, la cantidad de argumentos que reciben me quedó disponible fácimente, con myfunc.length.
Cuando necesité ejecutar un bloque de Logo (un arreglo en Javascript, en mi implementación), pude usar una propiedad adicional, block.compile, para tener una versión compilada, ya lista, sin necesidad de compilar cada vez (esa propiedad es un cache del bloque compilado). Eso fue posible porque Javascript me permite agregar esa propiedad compiled a cualquier objeto. Es un lenguaje muy flexible.
Próximos pasos:
- Implementar soporte de paréntesis (p.ej. (sum 1 2 3 4) debería aceptar 4 argumentos, y retornar 10 como resultado)
- Operadores binarios infijos, como +, –, etc… Ahora tengo nombres como sum, difference, multiply, quotient, etc..
- Más predicados de comparación
- Soporte de listas de propiedades
- Tortuga sobre un canvas
Tengo planeado agregar:
- Soporte de Objetos, definiendo métodos como tobj move ant …. end, donde ant es el nombre del objeto prototipo/clase
- Acceso a objetos Javascript nativos, sus funciones y variables
Publiqué una versión online en
http://www.ajlopez.com/ajlogojs
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez