jueves, 4 de junio de 2009

HAL y la burocracia (VIII - decisiones)

La vida es inconcebible como camino de dirección única. A cada paso se nos abre un sinfín de posibilidades, muchas veces incompatibles, ante las cuales no nos queda más remedio que elegir. Los senderos se bifurcan en el ambiguo jardín de la existencia. Pero nuestras elecciones no son, o no deberían ser, completamente caprichosas. La consideración reflexiva de las opciones presentes en las encrucijadas guían nuestra conducta. Por eso, una lengua que careciese de oraciones condicionales no sería humana o, cuando menos, no sería aplicable más que a un sector insignificante de la realidad vital.

Tampoco a la lengua de HAL le son ajenas las peripecias de la decisión, pues siempre llega el caso en que, dadas ciertas circunstancias, toca desviarse de la senda principal e iniciar una nueva. Por suerte, los "si es" y "si no es" de HAL son mucho más fáciles de aprender que las normas de la consecutio temporum, y las ambigüedades en las alternativas que presentan están terminantemente prohibidas, so pena de naufragar en resultados ininteligibles o simplemente abortados.

Consideremos un ejemplo trivial, para irnos acostumbrando a esta nueva rama de nuestro acervo lingüístico:

Si estoy en casa, di "hola"; si no, di "adiós".

Pongamos cada frase en una línea aparte para más claro entendimiento:

Si estoy en casa
di hola
si no
di adios

Las oraciones imperativas sabemos cómo expresarlas, son el meollo de todo lo que hemos pronunciado hasta ahora:

Si estoy en casa
echo "hola"
si no
echo "adiós"

También podemos construir un equivalente en lengua de HAL para la condición estipulada, la de estar en casa. Decir que estamos en casa es, visto desde la perspectiva de HAL, lo mismo que decir que nuestro directorio actual de trabajo es igual que nuestro directorio home:

Si $(pwd) = $HOME
echo "hola"
si no
echo "adiós"

Es fundamental advertir que el '=' en la frase $(pwd) = $HOME debe estar separado de los términos que compara por un espacio y que es, a pesar de su apariencia, completamente distinto del '=' de una expresión de asignación de valor a una variable (por ejemplo, ESCUDERO='Sancho Panza') donde los espacios de separación están prohibidos. La primera expresión compara dos cadenas de caracteres por su igualdad, mientras que la segunda asigna un valor a una variable.

El resto es el inglés corriente y moliente:

if $(pwd) = $HOME
echo "hola"
else
echo "adiós"

Finalmente, unas pocas normas ortográficas más: la condición va entre corchetes y a un espacio de distancia por delante y por detrás de ellos; tras el "si" (el if) ha de haber un "entonces" (un then); para terminar, la frase entera se cierra graciosamente con un if invertido (fi):

if [ $(pwd) = $HOME ]
then
echo "hola"
else
echo "adiós"
fi

Y, como convención de estilo, un bello espaciado que destaque la diferente función de cada ingrediente en la frase:

if [ $(pwd) = $HOME ]
then
echo "hola"
else
echo "adiós"
fi

El lector puede copiar este fragmento de código, pegarlo en su línea de órdenes y ejecutarlo. Si su directorio actual es su HOME, recibirá un caluroso saludo; en caso contrario, un fría despedida.

La facultad de construir oraciones condicionales abre un campo enorme de nuevas posibilidades para nuestros guiones y para nuestras conversaciones con HAL.

La primera aplicación es que en el guión simplificado que hemos producido estos días ya no tenemos por qué seguir suponiendo artificialmente que la nota de nuestro alumno es suspenso. Dicho de otra forma, podemos solicitar a HAL que realice las operaciones establecidas ---que en la redacción actual realiza en todo caso posible--- sólo si la calificación del alumno que consta en el fichero notas es inferior a la nota mínima necesaria para aprobar.

Construyamos, en primer lugar, la condición:

el campo tercero de la línea que consta en el fichero 'notas' ---el que almacena la calificación--- es menor que la nota mínima

En lengua de HAL:

$(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA

El operador -lt, abreviatura de less than (menor que), se utiliza precisamente para este tipo de comparaciones aritméticas.

La frase condicional entera sería:

if [ $(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA ]
then
ÓRDENES
fi

Como no necesitamos realizar ninguna operación en el caso de que la nota sea superior a la mínima, no es necesario crear una cláusula else para nuestra frase.

El guión completo con la condición añadida quedaría ahora como sigue:

# Directorio que contiene la programación del curso
PROGRAMACION="$HOME/guiones/informe_suspensos"

# Fichero que contiene la plantilla LaTeX del informe
PLANTILLA=informe_plantilla.tex

# Fichero que contiene las notas de los alumnos
NOTAS=notas

# Sufijo de los ficheros de objetivos por cursos
OBJETIVOS=objetivos.tex

# Sufijo de los ficheros de contenidos por cursos
CONTENIDOS=minimos.tex

# La nota mínima para aprobar el curso
NOTA_MINIMA=5

if [ $(cut -d':' -f3 $NOTAS) -lt $NOTA_MINIMA ]
then

# El nombre del alumno y curso con el formato que tendrán en la salida impresa
ALUMNO_OUTPUT=$(cut -d':' -f1 $NOTAS | sed -e 's/-/ /g')
CURSO_OUTPUT=$(cut -d':' -f2 $NOTAS | sed -e 's/\([[:digit:]]*\)-\(.*\)/\1\.º \2/' \
-e 's/ge/EE/' \
-e 's/gm/EP/')

# Las propuestas de trabajo se deben introducir interactivamente
echo "Introduzca propuestas de trabajo para $ALUMNO_OUTPUT [\item ... (^D para salir)]: "
cat > trabajo_tmp.tex

sed -e "s/ALUMNO/$ALUMNO_OUTPUT/" \
-e "s/CURSO/$CURSO_OUTPUT/" \
-e 's/OBJETIVOS/\\input{1-ge-objetivos}/' \
-e 's/CONTENIDOS/\\input{1-ge-minimos}/' \
-e 's/RECUPERACIÓN/\\input{trabajo_tmp}/' $PLANTILLA > Sancho-Panza.tex

pdflatex Sancho-Panza.tex
fi

Si lo ponemos a prueba, no habrá ningún cambio en su comportamiento. El informe Sancho-Panza.pdf se generará idéntico al del día pasado. Pero si cambiamos la nota de Sancho y le damos un aprobado, el guión terminará en silencio sin haber realizado ninguna acción, aparte de la asignación temporal de los valores de las variables, cosa que carece de efectos visibles para nosotros.

Resumen

  • La lengua de HAL dispone de la posibilidad de construir frases condicionales mediante la sintaxis:
    if [ condición ] 
    then
    acciones si la condición se cumple
    else
    acciones si la condición no se cumple
    fi

  • El operador '=' sirve para asignar valores a variables (ejemplo: VAR=val) o, inserto en expresiones condicionales, para comparar por su identidad cadenas de caracteres (ejemplo: cadena1 = cadena2).

  • El operador '-lt' dentro de expresiones condicionales sirve para verificar si un valor aritmético es menor que otro.

3 comentarios:

  1. Yo, en verdad, he de confesar que no conozco ni comprendo a HAL, porque son "lenguajes" que no manejo... Pero, qué razón tienes en eso que comentas al principio del artículo: me has dejado pensativa con 10 líneas que expresan una realidad inmensamente complicada y responsable, a su vez, del interés y del "ser" de la propia existencia, de nuestra vida: es maravilloso y terrible al mismo tiempo la concepción, más bien constatación de la vida como un camino que se bifurca en innumerables senderos a cada paso que damos, rutas todas ellas incompatibles, porque la vida es un viaje, y no somos más que "uno"... Quizás nos quede la esperanza, tras la elección razonada y meditada del primer recorrido, de que pasado un tiempo podamos realizar el viaje por aquel sendero que tuvimos que abandonar con lágrimas en los ojos... La vida es un viaje pero, nadie sabe a dónde ni cuánto de extenso...

    ResponderEliminar
  2. Me complace comprobar que mi artículo recibe un comentario sobre su pretexto "existencial". Veo que no está reñida la disquisición sobre una lengua artificial con la reflexión en torno a los problemas eternos.

    La discusión puede ir más lejos. Por ejemplo, aunque las elecciones pueden ser incompatibles en un principio, no por ello los caminos han de poseer necesariamente la incompasiva forma de la recta. A veces, los recorridos de la vida nos devuelven a los lugares del comienzo, que entonces aparecen, tras la entera experiencia del viaje, dotados de un nuevo sentido. Tramos de ida y vuelta, transcursos circulares en la aparente fuga del tiempo y la existencia.

    También con HAL se pueden realizar estos recorridos. Es lo que técnicamente se llama recursividad. Así, por ejemplo, podríamos reformular el ejemplo inicial del artículo y guardarlo como un fichero de nombre hacia_el_origen en un directorio, digamos ~/guiones/raros. Si nuestro directorio guiones no está en nuestro PATH, podemos incluirlo con una instrucción inicial (con el nombre de usuario que corresponda en lugar del mío). El nuevo ejemplo quedaría así, con recursividad incorporada. [Me permito introducir, ya que antes salió Borges, una referencia a Machado y a Eliot]:

    PATH=$PATH:/home/luis/guiones/raros

    if [ $(pwd) != $HOME ]
    then
    echo "Se hace camino al andar"
    cd ..
    hacia_el_origen
    else
    echo "In my end is my beginning"
    fi

    ResponderEliminar
  3. Ya que haces referencia a citas literarias, me gustaría incluír un poema del fantástico Benedetti al que todos, por desgracia, echamos de menos: por supuesto que los senderos no deben ser en línea recta y sólo "se hace camino al andar"...

    No te salves:

    No te quedes inmóvil
    al borde del camino
    no congeles el júbilo
    no quieras con desgana
    no te salves ahora
    ni nunca
    no te salves
    no te llenes de calma
    no reserves del mundo
    sólo un rincón tranquilo
    no dejes caer los párpados
    pesados como juicios
    no te quedes sin labios
    no te duermas sin sueño
    no te pienses sin sangre
    no te judgues sin sueño

    pero si
    pese a todo
    no puedes evitarlo
    y congelas el júbilo
    y quieres con desgana
    y te salvas ahora
    y te llenas de calma
    y reservas del mundo
    sólo un rincón tranquilo
    y dejas caer los párpados
    pesados como juicios
    y te secas sin labios
    y te duermes sin sueño
    y te piensas sin sangre
    y te judgas sin tiempo
    y te quedas inmóvil
    al borde del camino
    y te salvas
    entonces
    no te quedes conmigo.

    ResponderEliminar