Clojure: Entorno de desarrollo Mac OSX + Emacs + Leiningen… fácil
Ya traté de explicar como configurar un entorno de desarrollo con Mac OSX para Clojure en este artículo. Pero después de probarlo un poco y de los comentarios recibidos descubrí que 1) el proceso, que se basaba en un artículo de Bensmann, era bastante complejo y 2) mi artículo no daba a entender para qué tantos pasos.
Así que me propongo explicar una forma alternativa de instalar este entorno; una forma más sencilla. No hace falta, por lo tanto, haber leído el anterior artículo. En este explicaré como instalar todo el entorno basado en:
Presuposiciones
- Java instalado
- Maven instalado (no estoy seguro; puede que sin Maven instalado también funcione)
El proceso de instalación y uso
Cada uno de los pasos aquí mencionados se detalla en su propio apartado más abajo.
- Instalar Aquamacs
- Instalar Leiningen
- Instalar clojure-mode
- Crear un proyecto de Clojure
- Desarrollar
Instalar Aquamacs
Aquamacs es uno de los entornos Emacs más recomendados en OSX. La instalación és trivial. La única advertencia es que una vez instalado será necesario configurar las opciones de teclado para que sea posible escribir los carácteres que requieren de ALT en español, como ].
Para ello es necesario acceder al menú Options -> Option, Command, Meta keys y elegir la opción ...Meta & Spanish
Nomenclatura de atajos de teclado en Emacs
Por razones históricas (el uso tan solo de códigos ASCII imprimibles para los atajos de teclado) Emacs usa atajos de teclado que parecen muy complejos en comparación con otras aplicaciones. Muchos son compuestos de dos o más pulsaciones.
La notación tradicional de atajos de teclado en la literatura Emacs usa C- para indicar que debe pulsarse un tecla mientras se mantiene Control pulsado (ej. C-c), y M- para indicar que se debe pulsar una tecla mientras se mantiene Meta pulsado (ej M-.) (en Aquamacs, Meta es la tecla Alt). En este post y en adelante, usaré dicha nomenclatura para los atajos de teclado Emacs.
- Todos los comandos Emacs tienen un nombre que se puede usar para ejecutarlos. Así que el primer atajo de teclado a aprenderse es el que se usa para ejecutar comandos:
M-x <comando>. - Puesto que muchos atajos de teclado de Emacs son compuestos, a veces nos encontramos con que hemos introducido un atajo de teclado y Emacs (en la línea de estado del final) está pidiéndonos que sigamos introduciendo comandos o atajos de teclado. Para salir de esa situación (si nos encontramos en ella por error), aunque lo más intuitivo sería la tecla
ESC, en Emacs hay que pulsarC-g. En algunas veces, varias ocasiones seguidas.
Instalar Leiningen
Leiningen es una herramienta para automatizar el proceso de build en Clojure. Es una especie de Maven a la Clojure.
Su instalación es facil:
- Descargar el script
- Copiarlo en un directorio que esté en el path y hacerlo ejecutable (
$ chmod +x lein)
Instalar Clojure-mode en Aquamacs
clojure-mode es un paquete de Emacs que proporciona facilidades para desarrollar en Clojure. Para instalarlo solo es necesario descargarlo desde su web (enlace a la última versión del repositorio) e instalarlo como cualquier paquete Emacs (según se describe más adelante).
Slime
Clojure-mode incluye, entre otros, la posibilidad de usar Slime, un modo Emacs para el desarrollo LISP. Tal como indica su documentación,Slime permite, entre otras cosas, la evaluación y compilación de código LISP, documentación online (describe, apropos, hyperspec), búsqueda de definiciones (M-.), autocompleción de símbolos y packages, indentación, referencias cruzadas…
Para entender como configurar y usar Slime es necesario entender su arquitectura. Aquí Clementson nos ayuda a entender Slime. En resumen, se basa en una arquitectura cliente servidor en la que el modo Slime de Emacs es el cliente y Swank es un servidor de LISP.
La instalación de swank-clojure (el servidor Swank de Clojure) es sencilla gracias a lein:
$ lein plugin install swank-clojure 1.3.1
Cómo instalar un paquete emacs
Todos los Emacs, y Aquamacs no es una excepción, permiten la instalación de paquetes de ampliación, escritos en LISP. Los paquets son, por lo tanto, ficheros LISP, normalmente con extensión EL.
Una vez descargado un paquete, su instalación es sencilla:
- Copiar el paquete en
~/.emacs.d - Si no está ya, añadir esta línea a
~/.emacspara indicarle desde donde cargar paquetes:(add-to-list 'load-path "~/.emacs.d/") - Añadir la instrucción de carga del paquete a
~/.emacs:(load "<nombre_fichero_sin_extension>")
Crear un proyecto de Clojure
Con Leiningen, la creación de un nuevo proyecto es tan sencilla como usar lein new para crear la estructura inicial de directorios y un descriptor de proyecto (project.clj), y lein deps para descargar las dependencias del proyecto.
$ lein new <nombre_proyecto>$ cd <nombre_proyecto>$ lein deps
Esto creará una estructura parecida a las de Maven, donde el directorio src contiene fuentes de producción, el directorio test contiene fuentes de pruebas y el descriptor de proyecto se llama project.clj y está en la raiz. Como nota muy interesante, project.clj, en lugar de usar XML como haría Maven, usa, ¡oh, sorpresa!, Clojure.
Desarrollar
Ok, entorno listo. ¿Y qué nos permite hacer esto?
Clojure-mode (o, más concretamente, Slime) nos permiten navegar por el código, por sus definiciones, buscar usos de funciones, etc. Pero para ello es necesario arrancar un servidor Swank:
- Abrir el fichero project.clj desde Emacs (
C-x C-f) (para que el directorio actual sea el del proyecto) M-x clojure-jack-in
¡A partir de aquí podemos empezar a desarrollar! Algunos atajos de teclado interesantes para explorar las capacidades de Slime son:
C-x C-e: Evaluar la expresión de justo antes del cursor C-c C-r: Evaluar la región (selección) C-c C-d d: Describir el símbolo de debajo del cursor C-c C-w c: Mostrar quién invoca una función M-.: Ir a la definición M-,: Volver de la definición TAB: Autocompletar
Algunas cheat-sheets
Pero más allá de la pequeña lista que doy aquí, puede ser interesante hacerse con algunas cheat-sheets con los atajos de teclado de edición en Emacs y de Slime más interesantes:
Pruebas unitarias
Ya comenté que, de momento, iba a usar clojure.test para hacer pruebas unitarias. ¿Como las ejecuto en este entorno? Bien, el soporte para pruebas unitarias es mas bien escaso, pero siempre puedo dejar una sentencia (run-tests) al final de cada fichero de pruebas que tenga y ejecutarla manualmente (por ejemplo, situandome al final de dicha sentencia y pulsando C-x C-e).
Opcional: Instalar package.el y Marmalade
En este artículo hemos visto como instalar paquetes de Emacs a mano. Pero muchos usuarios de Emacs comentan que mantener el fichero .emacs con todos esos paquetes instalados a mano y actualizarlos cuando surgen versiones nuevas es un dolor de cabeza. Yo mismo he comprobado que instalar un paquete a mano cuando depende de otros paquetes también es un problema.
Por todo ello, se ha creado un paquete llamado package.el que funciona como gestor de paquetes. Dicho gestor utiliza un repositorio de paquetes en la web y mantiene tu Emacs actualizado con la última versión de cada paquete que se encuentre en el repositorio. Aunque el repositorio original era ELPA, uno de los más populares es Marmalade, puesto que permite a la comunidad cargar paquetes nuevos al repositorio.
La instalación de package.el y su configuración para el uso de Marmalade son bien sencillos:
-
Descargar package.el de Marmalade
-
Instalarlo
-
Configurar le repositorio de Marmalade y la inicialización de
package.elal arranque:;; Configure Marmalade package archive (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/")) ;; Initialize package.el (package-initialize)
Para usar package.el, el principal comando es la lista de paquetes (M-x package-install-packages) que nos permite navegar por una lista de todos los paquetes disponibles. Seleccionando un paquete con I lo marca para instalación y, después, X ejecuta la instalación. H ofrece ayuda adicional sobre los atajos de teclado disponibles en el listado de paquetes.
En mi experiencia, package.el aunque corre por ahí desde hace años, tiene bastantes bugs. Por lo pronto, no recomendaría instalar más de un paquete en una misma ejecución. Mejor marcar I y ejecutar X para cada paquete que querramos instalar.
Conclusiones
Ahora sí. Un entorno relativamente sencillo instalado y listo para desarrollar. ¿Siguientes pasos? Familiarizarse con Leiningen y Aquamacs a la vez que uno aprende Clojure escribiendo pruebas en clojure.test es ya bastante reto. Pero si en algún momento se me queda pequeño, algunos otros paquetes Emacs que pueden venir bien a este entorno (pero que aun no he probado) son:
- ParEdit: Modo menor de Emacs para formatear expresioens S (como las de Lisp o Clojure)
- clojure-test-mode (disponible junto a clojure-mode): Soporte para la ejecución de pruebas clojure.test






