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.
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...
ResponderEliminarMe 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.
ResponderEliminarLa 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
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"...
ResponderEliminarNo 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.