Archive for the '17565' Category

Code Katas en JavaScript/Node.js usando TDD

Monday, January 14th, 2013

En estas semanas pasadas, he estado trabajando en ejemplos y módulos JavaScript/Node.js, usando TDD en cada paso. Practicar, practicar, practicar, el camino a la maestría.

Pueden ver mi progreso y revisar los commits que hago ante cada test. Lo que sigue es un resumen de este trabajo:

CobolScript: Ver mis posts un implementación de compilador de COBOL a JavaScript, con ejemplos de consola ejemplo web, usando MySQL y SimpleWeb.

SimplePipes: Una manera de definir pasaje de mensajes usando ‘pipes’ para conectar diferentes nodes/funciones en un grafo. Quiero extenderlo para que tenga proceso distribuido.

SimpleBoggle: Un programa que resuelve un tablero de Boggle, juega mejor que yo! Ver ejemplo de consola.

SimpleMemolap: procesamiento tipo OLAP multidimensional, pero usando un modelo en memoria. Hay ejemplo web que usa mi SimpleWeb (“dog fooding”):

SimpleChess: En progreso, define un tablero usando SimpleBoard, y ya calcula movidas. Estoy también trabajando en SimpleGo, para tener un tablero, un juego y evaluadores.

SimpleRules: Motor de reglas  “forward-chaining”, hacia adelante (ahora que está de nuevo “de moda” la programación reactiva. Trabaja inspirada en algoritmo RETE-2, detectando los cambios de estado para disparar las acciones apropiadas.

SimpleScript: Ver mi post con las primeras ideas sobre este lenguaje, que compila a JavaScript, trabajo en progreso.

Py2Script: Compilador de Python a JavaScript, primeros pasos.

SimpleWeb: Una capa de “middleware”, a la Connect, con un ejemplo web:

BasicScript: Mis primeros pasos para compilar Basic a JavaScript. Quiero usarlo como lenguaje de programación para juegos en el browser.

SimplePermissions: El code kata de este sábado a la mañana ;-). Implementa Sujetos (Subjects), roles, permisos, otorgados en contexto.

SimpleFunc: Serialización/Deserialización de funciones y objectos con funciones.

SimpleMapReduce: Explorando la implementación del algoritmo Map-Reduce (y una variante, que llamo Map-Process) tanto sincrónico como asincrónico.

SimpleTuring: Implementación de una máquina de Turing.

Cellular: Implementación de autómatas de estado, lineales o de otras dimensiaones. Incluye un ejemplo de juego de la vida en consola.

Y en estos dos días pasados, agregué:

NodeDelicious: Para recuperar mis enlaces desde la cuenta de Delicious (sin tener que lidiar con el XML que devuelve directamente la API), ahora que el sitio ha sido rediseñado y no tiene paginación. La gente de Delicious sigue pensando que uno usa los enlaces como un feed (que lo viejo se pierde), pero no, muchos usamos a Delicious como un “Mis favoritos” en la nube y queremos acceder por rango de tiempo.

SimpleSudoku: Una reescritura desde 0, con TDD, de mi anterior AjSudoku, resuelve tableros de Sudoku.

Tengo que trabajar en:

SimpleDatabase: Base de datos en memoria, puede que en algún momento le agregue persistencia en archivos.

Y como siempre, todo esto es muy divertido 😉

Nos leemos!

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

SimpleScript (1) Primeras ideas

Thursday, January 3rd, 2013

Siguiente Post

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

CobolScript (2) Primera Función, Factorial

Tuesday, December 25th, 2012

Anterior Post 
Siguiente Post 

JavaScript es manteca en mis manos ;-). Estuve trabajando en mi proyecto CobolScript, compiladr de COBOL a JavaScript, que puede ejecutarse en el navegador o en Node.js.

Agregué soporte de funciones definidaspor el usuario, con parámetros, argumentos a pasar, y hasta variables locales. El primer ejemplo fue el clásico factorial recursivo:

https://github.com/ajlopez/CobolScript/blob/master/samples/factorial/factorial.cob

Pueden ejecutarlo en ese directorio, con la línea de comando:

node run factorial.cob

data division.
working-storage section.
01 n.

procedure division.
perform show-factorial varying n from 1 to 10.

show-factorial local result.
perform factorial using n giving result.
display n "! = " result.

factorial using n local m.
if n = 1 then return n.
subtract 1 from n giving m.
perform factorial using m giving m.
multiply n by m.
return m.

Le agregué nueva sintaxis:

performusing … Para llamar a un procedimiento local pasando argumentos.

– <proc> using …  El procedimiento declara sus argumentos.

– <proc> local(s) … El procedimiento declara sus variables locales (actualización: removido, ahora hay comando local(s)… directamente en el código del procedimiento).

performgiving <var>…  Puedo especificar que el valor de retorno del procedimiento (internamente, es una función JavaScript) sea guardado en una o varias variables.

return (expr)  El procedimiento puede retornar en cualquier momento, con un resultado opcional. Me falta implementar el clásico exit de COBOL.

Le agregué soporte de plantillas, páginas web dinámicas, y acceso a objetos JavaScript/Node.js nativos. Pero eso ya es tema para otro post.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

CobolScript (1) Compilador COBOL a JavaScript/Node.js

Sunday, December 23rd, 2012

Siguiente Post

Ayer, comencé un nuevo proyecto en mi cuenta de GitHub:

https://github.com/ajlopez/CobolScript

Es un compilador que lee COBOL y compila a JavaScript. Es un “work in progress”, pero el clásico “Hello, world” está ya corriendo:

https://github.com/ajlopez/CobolScript/blob/master/samples/hello/hello.cobs

DISPLAY "HELLO, WORLD".

Lo pueden ejecutar escribiendo desde ese directorio en la línea de comando:

node run hello.cobs

Un ejemplo más completo:

https://github.com/ajlopez/CobolScript/blob/master/samples/hellopgm/hello.cob

IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    AUTHOR. A.J.LOPEZ.
    INSTALLATION. TEST.
    DATE-WRITTEN. 2012-12-22.
    DATE-COMPILED. 2012-12-22.
ENVIRONMENT DIVISION.
    CONFIGURATION SECTION.
        SOURCE-COMPUTER. NODE.
        OBJECT-COMPUTER. NODE.
DATA DIVISION.
PROCEDURE DIVISION.
    DISPLAY "HELLO, WORLD".

Ejecutemos en ese directorio:

node run hello.cob

Actualización: pasé los ejemplos de arriba a minúsculas. Me comentaron que los COBOL modernos aceptan mayúsculas y minúsculas, así que voy a tratar de seguir escribiendo ejemplos pero en minúsculas.

Hoy sigo con este trabajo, implementando variantes de verbos como move, add, subtract, etc.. todo escrito usando TDD (Test-Driven Development). Tengo varias cosas que agregar como soporte de formato en los items (“picture”), la file section, y en algún momento, quiero agregar comandos SQL. También pienso poner páginas dinámicas ejecutadas en un servidor web soportado por Node.js. El código está armado de forma tal que también pueda ejecutarse en el navegador.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez