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.
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.

![[xml]](/images/xml.gif)
