SimpleScript (1) Primeras ideas

Las pasadas dos semanas, estuve entretenido escribiendo CobolScript, mi compilador COBOL a JavaScript (ver posts). Tengo programas de consola de ejemplo, y otros que son sitios con páginas dinámicas escritas en CobolScript, ejecutadas sobre Node.js (ver samples). Los ejemplos web usan el simple módulo Node.js nativo http, y hay uno que usa mi nuevo módulo SimpleWeb, un simple middleware sobre HTTP, a la Connect. Comencé también a escribir un compilador Python 3 a JavaScript, ver Py2Script. Y ahora, luego de entrenarme en esos proyectos (los primeros donde compilo a JavaScript usando JavaScript), quiero ir un paso más allá y escribir un lenguaje simple compilado, lo llamé SimpleScript (ver repo).

Los puntos principales:

- Compila a JavaScript, así que está orientado a ese lenguaje. NO es lenguaje de scripting a ser implementado sobre distintas tecnologías (por ejemplo, .NET, Java y JavaScript). Está totalmente orientado a la semántica de JavaScript.

- Me gusta la tradición del lenguaje C, pero esta vez no quiero tener punto y coma y llaves. Quiero una sintaxis más orientada a Python y Ruby.

- No quiero depender de los espacios para agrupar comandos. Me gusta Python, pero el tema de la indentación no la quiero en este lenguaje.

- No hay separador de comandos (como el punto y coma) solamente la nueva línea. Es decir, puedo escribir

if a < 1 a = 1

o

if a < 1
   a = 1
end

Vean el uso de end.

Pero no puedo (ni quiero) escribir DOS comandos en la misma línea:

if a < 1 a=1; b=2

En este caso, DEBERIA escribir:

if a < 1
  a = 1
  b = 2
end

- No más paréntesis alredor de las condiciones (ver el ejemplo de arriba).

- Una sola variante de for, el for … in , todavía lo estoy discutiendo conmigo mismo. Quiero tener un for..in… como en JavaScript, pero con alguna variante para poder acceder directamente a los valores en vez de a las claves/índices de un objeto/arreglo. Algo como

for k in myarray

itera sobre los índices de myarray. En cambio

for k in myarray values

iteraría sobre los valores de myarray, directamente. Una expresión de rangos:

for k in 0..n

compilaría a un simple for clásico.

- Los ciclos soportan continue, break. El principal comando de ciclo es while.

- Funciones como ciudadanos de primera clase.

- La palabra clave function keyword será usada para definir funciones anónimas. Estoy decidiendo si uso uso la palabra clave define para definir funciones con nombre.

- Invocación de funciones con parétesis explícitos (olvidarse de la convención de Ruby, o Python 2, ir hacia algo tipo Python 3.x).

- Acceso a arreglos con [] (olvidarse de la programación en Basic, donde se usan los paréntesis).

- Variables externas. Aprendí mucho de su utilidad con mi trabajo en los ejemplos CobolScript, donde uso linkage section para pasar y recibir valores al invocar un programa. Una variable externa es algo que se da en ejecución, al llamar al programa,no es una variable global (caso típico, el require de Node.js que depende del archivo donde se está trabajando). Por ejemplo, la función print puede ser una variable externa, de tal manera que el programa llamador puede definirla, para escribir a consola, a un buffer o al response de web.

- Las variables globales deben ser declaradas explícitamente. Todas las variables no declaradas se consideran locales (a la función donde están siendo usadas).

- Funciones tienen clausuras a la JavaScript. En contraste, por lo que entendí, en Python se debe declarar explícitamente su acceso. Prefiero la manera automática que usa JavaScript, así que por ahora la voy a incluir en el lenguaje.

- Llamadas asincrónicas. Lo agregué a CobolScript, y me parece que quedó simple y útil. Sería algo similar al await/async de C# 5.0

- Va a ejectuar en el navegador, y en Node.js.

- Soporte de clases: no me decido todavía, tengo un solo caso de uso, para usarla en la programación de juegos, en mi proyecto de juegos.

Sí, ya sé, hay otras implementaciones, como like CofeeScript. Pero quiero seguir enternándome en JavaScript, Node.js y TDD.

Nos leemos!

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

This entry was posted in 14005, 15035, 15550, 17565, 17594, 8870. 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>