miércoles, 11 de febrero de 2009

Aprender a leer con HAL

Cualquiera que, tras un conocimiento informal de una lengua, haya decidido acudir a una escuela de idiomas, se habrá visto sometido a un examen donde básicamente se evalúan cuatro destrezas, aparte del conocimiento de la gramática: la lectura, la escritura, la comprensión auditiva y la expresión oral. Con las lenguas artificiales ---y la lengua de HAL es una de ellas--- sucede algo curioso: si partimos del hecho de que nuestro dispositivo de comunicación es el teclado y la pantalla, los dos últimos aspectos se subsumen completamente en los dos primeros (y si nuestro dispositivo de comunicación fuese un micrófono y un altavoz, sucedería lo inverso, que para el caso es lo mismo). De ahí que conocer una lengua artificial equivalga a demostrar la aptitud suficiente para leer y escribir correctamente en ella.

Hasta ahora nos hemos limitado a hablar con HAL, a escribir las órdenes que convenían a nuestras intenciones comunicativas, pero apenas hemos leído nada distinto de lo que nosotros mismos íbamos escribiendo. Sin embargo, la lectura debería ser un ingrediente inexcusable de nuestro proceso de aprendizaje.

Por otra parte, suele suceder ---y ello es característico en el estudio de lenguas foráneas--- que, al leer, topemos con vocablos o, incluso, con construcciones gramaticales que no conocemos. Nuestro aprendizaje se acrecienta también en estos casos. Lo nuevo se presenta ahí por vez primera dejando su impronta en nuestro subconsciente y facilitando la llegada de ese momento en que aspectos hasta entonces desconocidos de la lengua se conviertan en parte activa de nuestro arsenal lingüístico.

Si esto último es posible es porque lo desconocido se da siempre dentro de un contexto en buena parte conocido. En caso contrario, lo desconocido sería prácticamente indescifrable. La parte conocida de la lengua aporta, pues, un marco de inteligibilidad desde el que se destaca lo aún ignorado y desde el cual el lector puede inferir en muchos casos su función y su significado dentro del contexto.

El fragmento propuesto el día pasado es, aparte de su utilidad concreta, un buen pretexto para llevar a cabo una lectura y, en concreto, hacer explícitos los mecanismos que se ponen en marcha en una lectura del tipo indicado.

Lo primero que encontramos es una serie de líneas que comienzan con el carácter '#' [A lo largo de este artículo cada elemento conocido de la lengua se enlazará con el lugar donde primeramente se expuso]. Sin embargo, el significado de la primera línea es oscuro:

#!/bin/sh

Si lo es para un humano, es que seguramente es algo que sí ve e interpreta HAL de cierta manera y que debe verlo al principio de todo, antes incluso de los comentarios iniciales.

Después de los comentarios empieza la orden propiamente dicha. Es una orden compleja que consta de varios miembros encadenados por tuberías y una redirección final. Conocemos todos estos elementos, incluido el separador de líneas '\':

grep ... | sed ... | awk ... | awk ... | awk ... > resumenes_hal.tex

La orden grep contiene opciones familiares: -E y -o, y podríamos interpretar, si leemos con suficiente atención, las expresiones regulares que aparecen en ella. Sólo nos es desconocida la opción -e. Un man grep arrojaría alguna luz al respecto.

En cuanto a la orden sed, y menos la opción -e, que tiene un significado semejante al que tiene para grep, casi todas sus expresiones regulares nos resultan bastante conocidas, por engorrosas que sean de leer. Incluso el uso abundante del signo '\' no debería resultarnos totalmente misterioso. Las únicas expresiones de las que no teníamos noticia son las siguientes:

  • '/Los pájaros de hogaño/d'

  • El final de los patrones con el signo 'g'

  • 's/<a href="\([^"]*\)">\([^\&]*\)/\2 (ver \1)/g'

  • 's/ \d39/ \d96/g'

Obviamente son construcciones especiales de sed (primera expresión y signo 'g') y una construcción más o menos conocida con dos expresiones regulares que no conocemos (las dos últimas expresiones).

Los tres awk que siguen a sed contienen mucho de lo ya aprendido:

Lo desconocido va desde lo que se asemeja a estructuras conocidas hasta lo que es por completo nuevo:

  • ORS, NF y FNR y el bloque END, que ---inferimos--- han de ser otras variables internas de awk y un bloque semejante a BEGIN, respectivamente.

  • Las estructuras que empiezan con if, else y for (y gran parte de lo que hay en su interior), de las que no podemos deducir nada a simple vista. Son, sin lugar a dudas, las zonas más herméticas del fragmento comentado.



Es evidente, por tanto, que, en la aparentemente incomprensible y larga orden que dimos a HAL el día pasado, hay un contexto suficiente de inteligibilidad que hace posible comprender con bastante precisión qué es lo que todavía no entendemos del fragmento y cómo podríamos cubrir esas lagunas. No es el objetivo de este artículo recorrer esta última etapa del proceso de comprensión. Las lagunas se irán cubriendo en artículos posteriores. Pero antes era necesario poner de manifiesto cuánto hay de familiar en un texto que no escribimos nosotros mismos y hasta qué punto esta familiaridad con ciertas estructuras lingüísticas sirve para allanar el camino hacia nuevas fases en el aprendizaje de una lengua como la de HAL.

Volvamos a ver como prueba la orden analizada. Los elementos lingüísticos conocidos están coloreados y enlazados a los resúmenes de las secciones donde fueron explicados. Naturalmente se sobrentiende que es igualmente conocido el texto corriente que forma parte de las expresiones regulares de grep y sed y de las acciones de awk, que es el texto que esta compleja orden procesa. Tras la explicación anterior y con esta nueva forma de presentación de la orden, se observará cuán poco es lo realmente oscuro aquí y hasta qué punto estamos cerca de entender el fragmento en su totalidad:


grep -E -o -e "<title type='text'>[^>]*</title>" \
-e '&lt;ul class="resumen"&gt;[^<]*' Conversaciones\ con\ HAL \
| sed -e 's/&lt;br \/&gt;/\n/g' \
-e '/Los pájaros de hogaño/d' \
-e 's/<title[^>]*>/section{/g' \
-e 's/<\/title>/}/g' \
-e 's/&lt;ul[^&]*&gt;/\\begin{itemize}/g' \
-e 's/&lt;\/ul&gt;/\\end{itemize}/g' \
-e 's/&lt;li[^&]*&gt;/\\item /g' \
-e 's/&lt;\/li&gt;//g' \
-e 's/&lt;code[^&]*&gt;/\\verb=/g' \
-e 's/&lt;\/code&gt;/=/g' \
-e 's/&lt;em&gt;/\\emph{/g' \
-e 's/&lt;\/em&gt;/}/g' \
-e 's/&lt;a href="\([^"]*\)"&gt;\([^\&]*\)/\2 (ver \1)/g' \
-e 's/&lt;\/a&gt;//g' \
-e 's/&gt;/>/g' \
-e 's/ \d39/ \d96/g' \
| awk 'BEGIN { RS=""; FS="section"; ORS=""; }
{
for (i = NF; i > 0; --i)
print "section" $i;
}' \
| awk 'BEGIN { RS="section"; FS="\n"; }
{ if (NF > 2)
print "\\section" $0;
else if (FNR != 1)
print "\\section" $0 "\n( Sin resumen. )\n";

}' \
| awk 'BEGIN { print "\\documentclass{article}";
print "\\usepackage[spanish]{babel}";
print "\\usepackage[T1]{fontenc}";
print "\\usepackage[utf8]{inputenc}";
print "\\usepackage{verbatim}";
print "\\usepackage{mathptmx}";
print "\\usepackage[scaled=.90]{helvet}";
print "\\usepackage{courier}";
print "\\title{Resúmenes de HAL}";
print "\\begin{document}";
print "\\maketitle" }
END { print "\\end{document}" }
{ print }' \
> resumenes_hal.tex

No hay comentarios:

Publicar un comentario