Programación literaria en Emacs. 1ª Parte.
Introducción
En el mundo de Emacs, es muy habitual que cuando vamos a alguna web o blog sobre este programa, hay algún apartado donde el autor muestra como ha configurado tal cosa en Emacs o directamente cómo él lo tiene configurado. Para ello, te suelen mostrar un fichero de texto, o el texto directamente para que configuremos nuestro Emacs. Con este fichero de texto, añadiremos, a Emacs, características nuevas o lo configuramos para que se adapte mejor a un uso en concreto, como escribir, programar en un lenguaje en concreto, etc.
Pero, ¿por qué se hace esto en Emacs, de manera tan complicada y no como en otros editores de texto donde solamente te indican que vayas a algún submenú en algún menú o como mucho que se instale algún plugin?
Bueno, realmente sí se podía hacer así. Emacs, viene también con sus menús de configuración, que podemos usar para configurar todas las características de él. Pero, como hemos repetido muchas veces, Emacs no es un editor, es un "Intérprete de Lisp", realmente una máquina de Lisp, que tiene un gran editor. Esto hace que la configuración de Emacs a base de acceder a menús sea muy compleja. Son muchas características que soporta Emacs, por defecto, y por lo tanto sus menús de configuración son muy extensos. En un artículo de un blog, lo haría muy largo, al menos si queremos hacerlo de forma más o menos entendible, así que habría mejor que recurrir a vídeos. Pero Emacs, tiene la facilidad por otro lado, de que todo lo configuramos va a parar a un fichero de texto, que por la naturaleza de Elisp es muy fácil de leer por humanos. Esto no pasa, por supuesto con otros programas en general. Así que desde hace mucho, es más cómodo en un tutorial o artículo sobre cómo configurar alguna característica de Emacs, poner el texto que tienes que añadir en ese fichero de configuración, que Emacs leerá en cuanto se ejecute para configurarse y añadirse nuevas características.
La mayoría de la gente, yo mismo cuando empecé, no entiende casi nada de lo que pone en el fichero de configuración, hay que saber algo de Elisp para entenderlo completamente y en un futuro haré un pequeño artículo de Elisp solo para ese propósito, pero normalmente la gente copia el fichero y punto. Como es un fichero con un lenguaje de programación, todos los lenguajes tienen una forma de añadir comentarios. Los comentarios son texto explicativo para los humanos que leen ese código pero que el ordenador no lo tomará en cuenta, es como si no existiera y así se ponen cosas para que el usuario entienda que hace parte del código sin saber nada de cómo funciona la programación que lo hace.
Nada indica la longitud de esos comentarios, pero en general los comentarios son varias líneas como mucho explicando de una forma resumida lo que hace ese código. En muchas ocasiones eso es totalmente suficiente, pero otras veces no, sobretodo si la persona que lee ese código es absolutamente lego en la materia. Por eso hay otra solución muy interesante llamada Programación literaria.
Programación literaria
La programación literaria (o letrada) es un estilo de programación propuesto por Donald Knuth para documentar los programas. Él mismo la empleo en su sistema tipográfico.
El estilo de programación literaria como se le ha llamado en español o programación letrada o instruida como se traduce literalmente, tal y como lo concibió Knuth, representa un movimiento disruptivo respecto a la escritura de programas en el orden y forma impuesto por el ordenador. En cambio permite a los programadores desarrollar sus programas en el orden fijado por la lógica y el flujo de sus pensamientos.
Para aclarar un poco esto, es darle tanta importancia a la documentación como al propio código. Es sabido por todos los programadores que la documentación es siempre la gran olvidada, bien por prisas, pereza, etc. Lo normal es llenar el código fuente con código y luego añadir comentarios que van explicando que va haciendo cada parte del código. Incluso ha día de hoy hay programas que consiguen extraer ese código y generar documentación con él en distintos formatos, bien sean .doc, .pdf, etc.
Pero la realidad, es que esa forma de realizar la documentación deja mucho que desear por lo siguiente. Normalmente los comentarios puestos dentro del código, tienden a ser concisos, cortos, y además sin seguir una continuidad literaria correcta. Además no se entienden sin el código, y a veces incluso con él. Por otra parte, el programador estará más atento a que el código funcione y por ello, los comentarios serán dejados para el final o incluso no se corresponderán correctamente con el cómo funciona el código. Así que finalmente, nos encontraremos una documentación, como escrita a trozos, probablemente desactualizada ya desde el mismo momento de la creación y no digamos si se hacen actualizaciones del código que normalmente esta misma actualización no se hará en la documentación.
Lo que propone Knuth es un cambio total de paradigma y de forma de trabajar, cambiando el flujo de trabajo.
Por un lado, el flujo es el siguiente; primero se escribe la documentación, como el que escribe una novela, explicando con todo detalle de lo que se quiere hacer y como hacerlo, y se va introduciendo el código dentro de ese relato, de una forma más natural y siguiendo un flujo más normal para un humano. Posteriormente, podremos generar un documento en distintos formatos donde esté toda la documentación junto con el código y por otro lado generaremos un fichero que será solamente el código. Esto hace que tanto la documentación sea atractiva tanto en su forma como en su contenido, ya que podremos generar documentos en pdf o html o incluso .doc, y luego también generaremos un código limpio que no esté lleno de comentarios que entorpezcan la lectura del mismo.
Usando programación literaria para el fichero de configuración de Emacs
Una de las mejoras cosas que trae de serie Emacs, tanto que algunos solo usan Emacs por esta característica, es el modo ORG, u org-mode. Definirlo es complejo y lo haré en sucesivos artículos pero resumiendo es por un lado un lenguaje de marcado y por otro lado una serie de herramientas que permiten usando ese lenguaje de marcado una cantidad de cosas insanas. Por ejemplo:
- Gestión de tareas, listas, listas numéricas...
- Creación de notas, documentos, tablas, etc.
- Exportación de a HTML, Latex, Markdown, iCalendar, OpenDocument, PDF y muchos otros.
- Agenda completa con características, como etiquetas, recordatorios, tareas que se repiten ...
- Uso de Babel para programación literaria, investigación reproducible, orgModeSQL.
- Pueden funcionar como una hoja de cálculo y generar gráficos
Realmente org-mode es increíble y no solo es capaz de hacer muchas cosas más sino que además basado en él, cada día se desarrollan nuevas herramientas y se amplia sus funcionalidades. En este momento, veremos solamente la opción de babel, que va incluida con org-mode y que es la que hace la magia de la programación literaria, es decir, coger nuestro documento, con código y con la literatura necesaria para explicar lo que queremos hacer y cómo lo hacemos con ese código y separarlo en un documento visualmente atractivo y fácil de leer y en código que en este caso, usaremos para añadir nuevas funcionalidades o simplemente configurar nuestro editor favorito.
Org babel
Babel nos permite que diferentes lenguajes trabajen juntos. Podemos añadir bloques de lenguajes de programación dentro de documentos org escritos en lenguaje natural. Ciertos datos se pueden pasar de una tabla hecha en org, y pasarlos a un bloque de código de Python, entonces podríamos moverlo a un bloque de código de R, y finalmente pasar los valores resultantes en medio de un párrafo o a un bloque de Gnuplot que genere una gráfica que se dibuje en el documento.
A través de extender Org con varias características para editar, exportar y ejecutar código de programación, Babel transforma Org en una herramienta para la programación literaria y la investigación reproducible.
Características de Babel:
- Interactividad y ejecución de bloques de código
- Los bloques de código pueden actuar como funciones que aceptan parámetros, referencias a otros códigos de bloque y pueden ser llamados remotamente
- Exporta ficheros para la programación literaria
Seguimos en el siguiente artículo
Para más información veremos más artículos, ya que veo que este se está quedando muy largo ya que tanto Org como Babel tienen gran cantidad de opciones y nos permiten hacer muchas cosas, por lo que, por un lado invito a que la gente vaya a su documentación oficial, y por otro lado veremos pequeños ejemplos de cómo usar esta programación literal para distintas cosas y finalmente explicaré como uso la programación literal para configurar mi Emacs y cómo cualquier persona se puede aprovechar de ello.
También pondré un ejemplo, fuera del mundo Emacs, de cómo lo uso para generar distintos Curriculum vitae de una manera más automática.
--------------------------------------------------------------------------------------------------------------------------
Si estás viendo este artículo desde un navegador web a través del proxi de flounder, aconsejo que accedas a la dirección de gemini usando un navegador compatible con este protocolo.
Gemini, es un protocolo minimalista que minimiza el uso de recursos del cliente y del servidor reduciendo las emisiones de carbono y además no permite el uso de programas que accedan a tu información personal, por lo que tu privacidad está asegurada.
Usa Gemini, salva al planeta, salva tus datos. Por un futuro mejor.
/informatica/emacs/articulos/