Notxor tiene un blog

Defenestrando la vida


Elisp para no programadores

Avisado quedas

Uno de mis propósitos para año nuevo era escribir una introducción a elisp para no programadores como yo. El objetivo es aprender: tengo comprobado que aprendo más cuando explico las cosas que cuando me las explican. Además, la documentación que encuentro sobre el tema en español es escasa. Si alguien decide leer esta serie de posts le debo advertir primero de una serie de hechos que pueden resultarle extraños:

  1. Soy psicólogo, no informático. No espere rigor en el vocabulario informático ni se extrañe de que llame pichorros o chismáticos a cosas que para un no programador se llaman pichorro o chismático. No obstante procuraré ser lo más preciso en el lenguaje y utilizar los términos correctamente.
  2. Debido a lo anterior, es posible que se encuentre uno explicaciones automágicas o no demasiado precisas, pero tal y como las entiende o puede entender un profano.
  3. También es posible que alguien haga las cosas de otra manera más lógica, más sencilla, más mejor o más friki. Para eso están abiertos los comentarios ─pero le recuero al supuesto lector que la lógica, la sencillez o el frikismo son subjetivos─. Si quieres que entienda otra lógica a la mía tendrás que explicar tu lógica de programación como para que lo entienda un psicólogo, no un informático.
  4. No esperes tampoco una explicación concienzuda y sistemática sobre todos los aspectos del lenguaje. Sólo hablaré sobre los temas que más utilizo o sobre los que quiero utilizar o los que conozco, para lo demás está el manual que viene incluido con emacs.

Pues eso, avisado quedas.

¿Qué necesito para hacer los ejercicios de este minicurso?

¿Tienes Emacs instalado?

Si la respuesta es , no necesitarás nada más. Si la respuesta es no ¿para qué estás leyendo esto?: Instala Emacs.

Cuando lo tengas instalado seguramente te gustará configurarlo a tu manera, si lo haces te encontrarás que tienes que escribir tu primer programa en elisp, aunque aún no sepas muy bien cómo funciona todo, conseguirás hacerlo. Al principio copiarás código de donde lo encuentres sin saber muy bien qué estás haciendo

Lisp

Lisp es uno de esos lenguajes viejunos que me gustan. De hecho, es el segundo más antiguo. Cuando empezaba en esto de programar lo petaban lenguajes como Smalltalk, Fortran o Lisp. En aquellos años me decanté más por Smalltalk, aunque aprendí esos tres, los dos últimos los olvidé por desuso. Luego vinieron otros lenguajes a ocupar sitio en mi cabeza, Pascal, C/C++, Python... y desplazaron incluso a mi querido Smalltalk.

Lisp significa LISts Processor, que viene a ser como un procesador de listas. Algo de lo que hablaré más en profundidad cuando llegue al tema de los tipos de datos, pero lo dejo aquí apuntado.

El caso es que Lisp volvió a aparecer en mis necesidades en el momento en que descubrí org-mode y me cambié a Emacs como herramienta de edición de cabecera. Emacs es un entorno Lisp y yo me resisto a llamarlo editor: es un entorno de programas Lisp que sirve para editar ficheros de texto. Por algún sitio leí, que los programas de Lisp en realidad son entornos Lisp que simulan ser otra cosa, como Autocad/® o /Emacs.

Emacs-Lisp

Como entorno Lisp que es, Emacs viene cargado con un lenguaje orientado al manejo de ficheros de texto, ventanas, buffers, bloques de texto y todo lo necesario para simular que es un editor de texto. Conlleva la ejecución de un lenguaje Lisp que conocemos todos como el elisp. No es un Lisp completo como podría ser el clisp, sino uno enfocado a la edición de texto. Sin embargo, se pueden utilizar aspectos más completos del clisp utilizando el módulo cl.el.

También se puede utilizar como un lenguaje de script más, pero lo habitual es que cualquier cosa que programemos con elisp se ejecute dentro del entorno de Emacs.

Manos a la obra

Bueno, pues manos a la obra. Vamos a trabajar un poco pero antes vamos a ver con qué herramientas contamos: Emacs nos proporciona todo un sistema de elementos para trabajar y que no necesitemos ninguna herramienta externa para programar. Si eres de los que cree que Emacs es un editor me gustaría que te replantearas la cuestión. Si utilizas Emacs sólo como editor, te estás perdiendo muchas posibilidades de la herramienta: apenas le estás sacando rendimiento.

Buffers

Es posible confundir lo que es un buffer con un fichero. Si sólo editas ficheros con él, lo que hace emacs es cargar el texto en un buffer de edición. Pero hay muchos más tipos de buffers que descubres cuando utilizas algunas herramientas. Un buffer es el espacio que utiliza emacs para interactuar con la información. El primero que nos encontramos es *scratch*.

scratch para todo

Este es el buffer para probar cosas, como expresiones, funciones, hacer cálculos sencillos, etc. Para ver cómo funciona, vamos a hacer una prueba muy sencilla. Vamos al buffer de *scratch* y escribimos, por ejemplo:

(message "Esto es un mensaje de prueba en scratch.")

Ahora, con el cursor situado en el final de esa expresión, vamos a pulsar la combinación de teclas C-x C-e. Al hacerlo estamos llamando al comando eval-last-sexp, que traducido es algo así como evaluar la última S-expresión. También podemos utilizar el más corto y socorrido C-j, que llamará al comando eval-print-last-sexp. ¿En qué se diferencia además de añadir un print en el nombre? Pues básicamente en que nos muestra en el mismo buffer *scratch* el resultado de evaluar la expresión. El primero nos lo muestra sólo en el minibuffer, esto es: mira en la línea inferior de emacs la que está por debajo de la línea de estado. Si te has perdido el mensaje que has lanzado, puedes ver que también está escrito en el buffer *Messages*. Sin embargo, cuando lleva el apellido print además de mostrarlo allí, lo muestra en el mismo buffer *scratch*.

Algo muy socorrido cuando queremos hacer algún cálculo sencillo. Por ejemplo:

(+ 9 5)

Si pulsamos C-x C-e veremos que en la última línea nos muestra algo parecido a 14 (#o16, #xe, ?\C-n). El primer número nos dice el valor decimal y luego, entre paréntesis, el valor octal, el hexadecimal y el valor del carácter. En este caso, como el número es muy bajo, el valor que nos muestra es un valor especial que significa C-n. Si el valor fuera, por ejemplo, 65, el carácter representado sería la letra A. Sin embargo, si utilizamos el atajo C-j se limitará a escribirnos en el mismo buffer *scratch* el resultado en decimal y no nos dará más información.

Conclusión

El artículo de hoy es sólo una introducción a las herramientas y quedan muchas cosas, más de las que me gustaría, pero sería demasiado largo explicar más cosas. De momento me quedo con que tenemos entre manos un entorno de programación completo funcionando, un entorno vivo, que permite que le pasemos código sobre la marcha, que nos permite guardar ese código en ficheros y cargarlo cuando lo necesitemos.

El ejemplo de este tipo de ficheros es el de configuración de emacs. Quizá intimide un poco al principio pensar que para usar el editor hay que programar, sin embargo es más sencillo de lo que parece a primera vista y mucha gente sin conocimientos de programación es capaz de configurarlo.


Comentarios