11 de Mayo, 2004

J-Lan Communicator 1.4

Acabo de publicar la versión 1.4 de mi J-Lan Communicator (jlanc), un pequeño programa de chat para redes locales hecho en Java.

Entre las nuevas características, no muchas, está la posibilidad de añadir funcionalidades al programa mediante scripts en el lenguaje de programación Forth.

La razón para usar Forth quizás no es práctica. No encontraba un intrérprete pequeño y sencillo de integrar, y como además disfruto programando, pues elegí hacerme yo un intérprete para empotrar en jlanc, que debía estar hecho en Java.

Así nació Simple Forth Interpreter en Febrero de este año, porque un intérprete de Forth es relativamente sencillo de implementar, y además la naturaleza del lenguaje parecía encajar en el propósito que buscaba en el comunicador: un lenguaje orientado a eventos.

Sí, bueno. Me meto en aventuras un poco raras :). Tanto jlanc como sfi me sirvieron de excusa para aprender a programar en Java.

Voy a poner un ejemplo de script para jlanc: away. Se trata de una 'secretaria' que dejará un mensaje cuando estemos lejos del teclado y alguien nos nombre.

jlanc
Nuestro script en acción

Con alguna explicación el código será bastante legible, sin entrar en la sintaxis del lenguaje.

Veamos el código:

\ J-LAN Communicator
\ Forth CODE (AWAY)

: ON.INIT (se ejecuta al arrancar el intérprete)

	C"AWAY" C"Away" ADD.USER.COMMAND

	VARIABLE AWAY.STATUS
	VARIABLE AWAY.MSG
	
	FALSE AWAY.STATUS ! (no estamos away)
	C"dummy" AWAY.MSG ! (tiene que estar inicializada)
;

: ON.NICK (alguien me nombra)

	(si estoy away, el mensaje)
	AWAY.STATUS @ TRUE = IF
		(para que no salte ON.SEND)
		FALSE AWAY.STATUS !

		(mostramos la cadena en AWAY.MSG)
		MSG AWAY.MSG @ COUNT TYPE

		(volvemos a estar away)
		TRUE AWAY.STATUS !
	THEN

	DROP (eliminamos el param. que no hemos usado)
;

: ON.SEND (si escribo, dejo de estar away) 

	AWAY.STATUS @ TRUE = IF
		."You're back!" CR
		FALSE AWAY.STATUS !
	THEN

	DROP (eliminamos el param. que no hemos usado)
;

: AWAY (me marca como away)

	AWAY.MSG @ FREE.STRING (borramos el msg viejo)

	C"Enter your away message:" READ.STRING
	AWAY.MSG ! (guardamos el nuevo)
	
	TRUE AWAY.STATUS ! (estamos away)

	."You're away" CR
;

Este código se situará en el fichero $HOME/.jlanc.fth, y funciona tal cual.

La función ON.INIT (WORD o palabra, hablando en Forth) se invoca cuando el intérprete arranca. Así que ahí llevamos a cabo las tareas de inicialización. En este caso añadimos un comando de usuario (que aparecerá en el Menú usuario en el programa) que tiene la cadena de texto Away visible en el menú e invoca a la función AWAY, definida más adelante. También se declaran 2 variables y se inicializan.

AWAY.STATUS comienza con el valor falso, ya que en un principio no estamos away, y AWAY.MSG se inicializa a un valor cualquiera porque al introducir el usuario un mensaje tendremos que borrar el anterior, y en un inicio el usuario nunca estará ausente.

Además se definen 3 funciones más: dos eventos y AWAY.

AWAY libera el texto en uso como mensaje de ausencia, pide al usuario la nueva cadena y la almacena (Estoy en el tigre en la imagen). Por último pone la variable AWAY.STATUS a cierto y manda un mensaje local avisando del cambio de estado.

Las dos funciones que capturan eventos dan la funcionalidad al script, ya que ON.NICK se llamará cuando alguien mencione nuestro alias y ON.SEND se invocará cuando enviemos un mensaje a la red.

ON.NICK envía a la red el mensaje que indicó el usuario en caso de que AWAY.STATUS sea cierto, asegurándose de cambiar el estado al enviar para que ON.SEND no interfiera. Esta es nuestra secretaria en acción ;).

ON.SEND, por último, desactiva nuestro estado de away cuando enviamos un mensaje a la red (siempre que no sea nuestro ON.NICK el que envíe, ya que lleva cuidado de cambiar el estado al hacer los envíos).

El código es bastante simple y, a poco que sepamos Forth, sencillo de comprender.

Igual resulta un poco complicado de explicar y no se si alguien habrá podido seguir el artículo, pero bueno :D. He escrito un pequeño resumen con las características scripting de jlanc, a modo de introducción.

Anotación por Juan J. Martínez.

Hay 3 comentarios

Gravatar

Que currado. Y que duro que eres, usando Forth para los plugins :) ¿Podrías haber optado por Python no?

por ToReK, en 2004-05-12 16:30:03

Gravatar

Jython es a lo que te refieres: http://www.jython.org/
Aunque para eso me quedo con BeanShell: http://www.beanshell.org/

¿Por qué no usar uno de estos? Porque el intérprete sería más grande que la aplicación :) Actualmente jlanc son 130Kbs +- (inluyendo el intérprete). De los mencionados el más ligero es BSH que ya pasa los 140Kbs.

Además no eran muy amigables para integrarlos. Supongo que al sobrar potencia se ganaba en complejidad. Por eso opté por el do it yourself.

por Juanjo, en 2004-05-12 16:40:35

Gravatar

La leche, y todo eso, como escusa para aprender java, mo0o0ola tio... yo algún día aprenderé a hacer algo, por que a veces no se ni lo que hago xD

Salu2 Caleidos

por Caleidos, en 2004-05-13 11:17:31

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.