AjLogo en Javascript (1) Primera Implementación

Published on Author lopezLeave a comment

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 Javascript:

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

Leave a Reply

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