I7: Paradigma aventuril

Aprovechando la publicación de la última versión con su correspondiente e inmediata localización hispana (gracias Sarganar) me he liado la manta a la cabeza para dar un repaso al “manualillo” y jugar un poco con él. Estas son mis impresiones.

La primera vez que vi inform 7 me pareció horroroso. No veía por ningún sitio esa pretendida claridad en el aspecto de su “lenguaje natural”. A la vista de algunos fuentes me pareció engorroso, innecesariamente barroco en las definiciones, y desde luego nada más lejos que ser un lenguaje para “no programadores”. 

La aparición de las primeras creaciones con su patente lentitud no hizo más que empeorar su imagen. Y sin embargo, con el paso del tiempo no ha ido más que aumentando su popularidad como herramienta oficial para crear ficción interactiva.  

¿Qué cosa es inform 7? ¿Programación declarativa, sistema orientado a reglas, inteligencia artificial…. ? Pues creo que nada de eso. Yo diría que inform 7 responde a un paradigma… aventuril. O más sencillo, al paradigma que al Sr. Nelson le ha parecido más adecuado para representar una historia de ficción interactiva. A grandes rasgos el sistema consta de:

  •  Un motor de juego, implementado en las Standard Rules que todo relato incorpora por defecto. Si lo tomamos como una caja negra podríamos decir, con alguna licencia, que es una reproducción del modelo de juego de I6.
  • Un lenguaje de definición de mundo, que básicamente establece la situación inicial de los objetos de forma imperativa -exclusivamente, aunque la sintaxis de lenguaje natural pueda inducir a equívoco en ese aspecto-, así como definiciones auxiliares para facilitar y simplificar el código: clases, frases, rulebooks, adjetivos… (como esto no es un tutorial, si alguien quiere profundizar, le invito a consultar alguno de los manuales introductorios publicados).
  • Y por último, y más importante, una lista de excepciones a las reglas definidas en el primer apartado.

Pero vayamos por partes. I7 es ampliamente conocido por su peculiar sintaxis. ¿Inform 7? Si hombre, el invento ese que se escribe en inglés natural… Bueno, casi, aunque sería algo injusto reducir sus características a eso. 

La sintaxis natural fue un intento de atraer a muchos autores que, quizá con cierta ingenuidad, recelan de la dificultad que supone aprender a programar cuando ellos lo que quieren es contar una historia. Lo malo es que eso no es cierto con I7. El lenguaje tiene una curva de aprendizaje empinada. Bastante empinada. Y si no tienes experiencia con la programación clásica, más empinada aún.

La sintaxis es natural en un sentido, es decir, si yo leo un fuente de I7, parece lenguaje natural. Hay coherencia en los tiempos verbales, artículos, pronombres, etc. Pero lo inverso no lo es. No podemos simplemente sentarnos a escribir lo que se nos pase por la cabeza por mucho que nuestro inglés rivalice con el mismísimo Dickens. I7 tiene una sintaxis. Y es muy escurridiza. Desde directamente fallar la compilación hasta -lo que es peor- permitir compilar nuestra maravillosa descripción en guiri pero no responder como suponemos cuando se ejecuta el relato. 

Sin embargo una vez se le coge el tranquillo, y aprovechando las virtudes semánticas del lenguaje natural, puede sorprendernos con algún pequeño regalo. Estoy hablando de las definiciones implícitas.

The office is a room. The backoffice is north of the office and east of the bathroom. A table is in the office. On it is a pencil and a glass. In the glass are a broken pencil and a rubber.   

El párrafo anterior es un programa completo en I7. En él hemos definido un mapa con tres localidades y sus conexiones, un objeto sobre el que poner otros encima, otro que es un contenedor, otros tres objetos normales, y la disposición de todos ellos en relación a los demás (el lápiz está encima de la mesa, etc.). Una cucada, vamos, aunque no es lo más llamativo de inform 7. 

Lo más llamativo es el cambio en la forma de plantear la creación de un relato de ficción interactiva. I7 representa un salto respecto a parsers anteriores. Y esto es parte de la dificultad en su aprendizaje. Lo normal es que el flamante usuario de I7 haya programado con I6 y tenga incluso su background formado, y ahora quiere aprovecharse de las mejoras de I7 aplicando sus conocimientos adquiridos en I6. ¡Peeeee!…Error. Hay incluso un diccionario de traducción de expresiones de I6 a I7 creado por Emily Short para facilitar los primeros pasos a los nuevos creadores de I7. ¡PEEEEE¡… Nuevo error, y de los gordos. 

I7 se puede programar como I6, pero eso sería desaprovechar su potencia. Podemos emular perfectamente los before, after, daemons, etc, pero estaríamos menospreciando las bondades del lenguaje, algo así como si utilizáramos C++ a modo de C con clases. El mundo que creamos con I6 es un mundo de objetos y acciones. El mundo de I7, en cambio, va de reglas.  

¿Por qué cruzando el puente se derrumba? Por las reglas. ¿Cómo cambio el mensaje por defecto de…? Con las reglas. ¿Cómo encamino al parser a los objetos adecuados? Reglas… ¿Qué pasa cuando el juego comienza? ¿Y cuando termina? ¿Y cada turno que espero junto a la parada de autobús llevando una máscara de payaso mientras una anciana rokera intenta subirse a un árbol en el que hay exactamente tres gatos? Reglas, reglas, reglas… ¿Y por qué mi nueva superaventura en glulx va tan lenta? Er… Por las reglas, pero luego hablamos de eso. 

Tan versátiles y profusas, que se han dividido en libros de reglas (rulebooks) para clasificarlas. Cada libro contiene desde un par hasta cientos de reglas. Y tan numerosas que hay no menos de 300 de esos rulebooks antes de escribir siquiera una sóla línea de nuestro relato.  Podemos añadir y quitar reglas, crear nuevos rulebooks con las nuestras, controlar el orden en que se evalúan las reglas dentro de un rulebook, ponerles nombres, invocar la evaluación de un rulebook a discreción.

¿Qué es lo que hace interesante a I7 frente a toda esta aparente complejidad, entonces? Su potencia.  Y no me refiero a que puedan hacerse muchas cosas con él. Todo lo que podemos hacer con I7 se puede hacer con I6 y con casi cualquier otro lenguaje al uso. Tampoco puedo montar un servidor de aplicaciones con soporte para JSP con I7, que como todo el mundo sabe es algo muy interesante en la ficción interactiva… Lo que realmente hace potente a un lenguaje, lo que lo distingue de sus congéneres, es la facilidad con la que nos permite trasmitirle nuestras intenciones en el ámbito para el que ha sido creado. 

Y en el ámbito de la ficción interactiva en español, Inform 7 es el lenguaje más potente disponible hasta la fecha. Punto. 

Porque la versatilidad para definir condiciones (que disparan reglas) en inform 7 es abrumadora. Con las reglas de I7 podemos controlar desde la respuesta a un simple comando ‘saltar’ hasta situaciones que abarcan varios turnos y varios objetos con sus condiciones particulares. Y todo en una frase. Esa es precisamente una de las trampas de I7. Da tanto control al programador para determinar las condiciones de cumplimiento de una de esas reglas que es fácil dejarse llevar por la semántica, y descuidar el coste de ejecución de dichas expresiones hasta que la respuesta a nuestros comandos empieza a tardar… y tardar. 

Esas condiciones se pueden expresar (entre otros) en términos de:

  • Estado. De objetos y personajes, presente o pasado. Sí, qué pasa, podemos decirle que dispare la regla sólo si algo ha cumplido la condición en el pasado, aunque no sea la situación actual, o si ha ocurrido un número de veces especificado: si la puerta ha estado abierta, si nuestro contacto ha llamado a ella exactamente tres veces, …
  • Ámbito: se puede especificar una condición de clase, de atributo, e incluso de adjetivo, que es como un atributo cuyo valor depende de una situación variable, más que de un valor asignado en un momento u otro.
  • Relaciones entre objetos. Es otra característica novedosa de I7 que permite establecer vínculos entre objetos con diferente cardinalidad. Un contenedor tiene la relación de contención con los objetos que contiene, una localidad es adyacente a otra si se nos podemos desplazar a ella con un sólo movimiento, etc.

Así, el compilador no pondría pegas para definir algo tan genérico como esto:

The Sala capitular is a room. East of sala capitular is the Baño.
A monje is a kind of person. There are 24 monjes in the sala capitular. There is a monje in the Baño.
Instead of asking a monje about something when in the Sala capitular and every monje cannot see every monje, say “‘El concilio aún no puede comenzar, esperemos a nuestros hermanos.’” [<- esta es mi regla ineficiente ]   

Que funcionaría como se espera pero introduciría un retardo acumulado por al tener que comprobar el estado de cada uno de los acólitos por separado, ya que hemos expresado una condición de clase que además tiene en cuenta a todos los miembros de una clase en todo el mundo de juego.

Instead of asking a monje about something when in the Sala capitular and at least one monje is not in the Sala, say “‘El concilio aún no puede comenzar, esperemos a nuestros hermanos.’” [<- un poco más eficiente ]   

En inform 7, al igual que ocurre en un lenguaje declarativo, hay que conocer el proceso interno y las implicaciones de nuestras expresiones, a riesgo de poner en peligro la eficiencia en la ejecución. No es que el lenguaje sea lento, es que nos permite expresar casi cualquier cosa –siempre que dominemos la sintaxis- de forma directa y sencilla.

Este enfoque basado en reglas aplicables casi a cualquier nivel, favorece que la tarea de acometer una obra nueva se plantee, no como una definición de objetos y sus comportamientos, sino una declaración genérica de las normas que rigen nuestro mundo de juego en términos globales.

Por otra parte, hay que tener en cuenta que la evolución de I6 paró cuando se publicó I7, por lo que todas las mejoras que se han ido incorporando, aparte del modelo de reglas, no han sido reproducidas en la librería I6. Y son unas cuantas. A modo de resumen, el avance de I7 respecto a I6 incluye:

  • El IDE, que en un solo programa integra el editor, el compilador, el intérprete z/glulx, ayudas a la depuración, publicación en Web, mapa de símbolos estructurado de nuestra aventura, la documentación, y un largo etcétera.
  • Mejoras radicales en la parametrización de los mensajes.
  • Método más sencillo y versátil para definir la gramática, incluyendo interpretación de comandos en función de condiciones de juego.
  • Manejo de cadenas casi a nivel de cualquier lenguaje clásico (por fin).
  • Estructuras de datos Lista y Tabla, con diversas posibilidades de integración con el código, desde leer un registro asociado a un índice hasta definir objetos o asignar propiedades en función del contenido de esas estructuras.

Como digo es sólo un resumen, pero basta echar un vistazo a cualquier apartado de la documentación para comprobar la ingente cantidad de ayudas a la programación que se han incorporado desde la versión 6.

Como aspectos negativos, destacaría:

  • La sintaxis, me sigue pareciendo fea y poco amistosa. Propensa a errores sintácticos tontos por su similitud con el lenguaje natural.
  • Una curva de aprendizaje alta para dominar el lenguaje.
  • Hay que escribir en inglés, aunque nuestras creaciones hablen español.
  • Sigue sin permitirse la instanciación dinámica, lo que limita la complejidad de las estructuras de datos que podemos crear.
  • Si no se tiene cuidado puede incurrirse en expresiones ineficientes que hagan la respuesta lenta a los comandos del jugador.
  • Se ha eliminado la herencia múltiple, que permitía su antecesor.

Pese a lo anterior, después de mi experiencia recomiendo hacer el esfuerzo y pasarse a I7, no por que sea lo mejor que podemos tener, pero sí por ser lo más potente, con sus defectos, que existe ahora mismo para crear cosas en español.

Advertisement

15 Respuestas a I7: Paradigma aventuril

  1. Johan Paz dice:

    Grande. Al fin habla con propiedad de I7.

  2. Incanus dice:

    Y sin embargo, me cuesta hacerme a la idea de pasarme a I7 + INFSP, precisamente por esto de la curva de aprendizaje: si apenas me queda tiempo para la autoría, ya ni les digo para una curva de aprendizaje adicional.

    [INCANUS]

  3. Haz una breve sencilla en I7, a ver si la potencia te vale para dejar Inform 6. Yo sinceramente, programando Dracula 3, a veces me dan ganas de volverme a I6 :) Pero la comodidad de ciertas cosas lo compensa.

    Masto, ¿por qué dices que la instanciación dinámica no existe? ¿Podrías elaborarlo? Es paradójico, pues Glulx si lo permite, ?no?

  4. Mastodon dice:

    Pues creo que no hay ninguna expresión para crear un objeto de la nada en tiempo de ejecución, algo como:
    “now there is a glass in the table…”
    aunque el lenguaje es bastante flexible para distribuir objetos al inicio del juego -y sólo al inicio.
    Pero corregidme si no es así.
    Por otra parte el tamaño de las tablas y listas debe estar predefinido y no puede ampliarse durante el juego.

    Glulx en cambio es una máquina virtual por lo que no tendría mucho sentido a hablar de que lo “permita” o no. Simplemente el lenguaje de alto nivel debe implementar un mecanismo para asignar un segmento del espacio de memoria glulx como heap y a correr.

  5. Johan Paz dice:

    Pero Urba, Z no lo permite en cualquier caso.

    • Pero Glulx si lo permite, no es incorrecto lo que he dicho. Si la máquina Glulx permite manejo dinámico de memoria, inform6 podría y de hecho puede, crear objetos dinámicamente en tiempo de ejecución (por ejemplo, generar un enano de una guarida y que cada enano lleve su propia hacha, que dejarán atrás al morir… eso se puede hacer).

      Eliuk ha explicado el resto… lo que me parece increible es que lo hayan hecho para I7 en Z, pues Z no puede alojar memoria dinámicamente, quizás reserve espacio para X objetos dinámicos. En todo caso, todo son buenas noticias :)

      • Eliuk Blau dice:

        Efectivamente. La Máquina-Z de toda la vida, o mejor dicho, el Inform6 de toda la vida para Z siempre ha permitido un mecanismo de creación dinámica de objetos (muy primitiva), siempre que se especifique un límite de la cantidad de objetos potencialmente “creables”. Este mecanismo funciona de la misma manera en Z y el Glulx.

        Por otro lado, y esto es harina de otro costal, Glulx incorporó desde sus inicios un mecanismo adicional para reservar memoria arbitraria a petición, que podría usarse para lo que el programador estimara conveniente.

        Cuando salió I7, se hicieron unos hacks para conseguir esto mismo en Z, pero esos códigos retorcidos pertenecen solo a las entrañas de I7 y creo que solo muy pocos saben bien cómo funciona (básicamente, los creador de I7 y los de intérpretes). Eso fue para replicar la funcionalidad de asignación de memoria de Glulx, pero en Z. De todas formas, fue trabajo perdido, porque ya se sabe que las aventuras actuales de I7 quedan cortas para guardarlas en Z, y se debe tirar de Glulx por razones de espacio.

  6. Incanus dice:

    Estimado Ruber:

    Pues… hice un intento de traducción al inglés de “El Protector” (original en InformATE!) usando I7 en vez de I6 y me hice un lío gordo.

    También es cierto que no lo terminé y que “El Protector” lo es todo menos sencillo de programar.

    [INCANUS]

    • Fernando Gregoire dice:

      Incanus, ¿En qué sentido te hiciste lío?
      En cuanto a I6, cuando escribes una aventura en inglés usas el Inform 6 original, o la complicada extensión Inglés de InformATE. En cuanto a la programación con I6 en español, ¿no pensaste alguna vez en pasarte a INFSP que está algo más evolucionado, la comunidad lo mantiene, es bastante parecido a InformATE a no ser porque debe escribirse en inglés, permite usar con muchísimos menos problemas extensiones diseñadas para I6 original, escribir ficción en inglés es más fácil y está mejor documentado al servir bastante más de lo que dice en el Designers manual comparado con lo que para InformATE se puede sacar del mismo?

      • Incanus dice:

        Me hice lío con la sintaxis de I7 que en efecto de natural, nada.

        Y sí, he considerado INFSP con I6 como paso “al costado” de InformATE! pero aun no me decido… aunque entiendo que es trivial traducir el código fuente de un programa y/o librerías de InformATE! a I6 con INFSP (hay utilidades automáticas y tal).´

        Supongo que estoy cómodo con InformATE! y eso pesa no poco.

        Sobre escribir IF en inglés directamente (no traduciendo) no cabe duda que probaría primero con I7 que con I6… pero no tengo prisa. Con el español y los hispanoparlantes I’m more than satisfied, for the time being ;-)

        [INCANUS]

  7. Fernando Gregoire dice:

    Si no fuese porque las pestañas del IDE de I7 son algo de difíciles de acceder con el teclado y porque ciertas cosas como los índices, libros de reglas etc. se muestran técnicamente como una página Web (lo cual para lo que son creo que no corresponde) haciendo muy difícil la interacción con ellos, al no haber aprendido ningún lenguaje de programación (apenas agarré un día el tutorial la torre de InformATE) empezaría con I7 porque para el usuario neófito el tener muchas cosas facilitadas por un IDE es muy cómodo. Lo que le faltaría por lo que vi es permitir usar texto a voz mediante SAPI en las versiones reducidas de los intérpretes que trae Inform 7 para probar el juego durante su desarrollo.

  8. Johan Paz dice:

    Bueno, no es cierto que necesariamente haya que usar Glulx en I7. Es díficil no usarlo en una aventura larga, y es casi imposible no pasar a z8 enseguida, pero sigue siendo preferible usar z8 que glulx. Entre otras cosas porque la función de Parchment aún no está conseguida correctamente por el intérprete de glulx online que estuvieron desarrollando. Así que me parece un acierto que se intente mantener la compatibilidad con la máquina Z.

    Es lógico que de todas formas el resultado sea mucho más pesado, ya que las cosas que se pueden expresar en I7, como explica Mastodon en el artículo, son netamente superiores a las que se pueden expresar en I6, al menos sin un arduo trabajo de replicar toda esa funcionalidad uno mismo.

  9. bthekid21 dice:

    >ENCENDER TELÉFONO_

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.