Clojure: Configurar un entorno de desarrollo en Mac OSX basado en Emacs (con Slime) y Leiningen
29/08/2011: ¡¡NOTA!!
Artículo deprecado. Consultar última versión aquí.
Cuando escribí este artículo me basé en otro artículo de Ralf Bensmann. Aunque mi instalación del entorno funcionó, el proceso descrito era bastante complejo. Gracias a algunos comentarios (en este blog y en persona) descubrí que se podía hacer de forma mucho más sencilla. Por ello escribí otro artículo que podéis encontrar aquí.
Este artículo, por lo tanto, queda obsoleto. Lo dejo por aquello de la etiqueta de no borrar nada de un blog. Que si no…
El artículo original
En este artículo explico como configurar un entorno de desarrollo sobre un Mac OSX para Clojure. Usaré Aquamacs (un Emacs) con Slime y Leiningen.
En un artículo anterior comenté que estaba buscando el entorno de desarrollo y de build ideal para aprender Clojure. Después de escribir el artículo y leer los comentarios mis conclusiones son:
- Usar Emacs como entorno de desarrollo
- Usar Leiningen como entorno de build
Así que me lanzo a por todo. Un entorno completamente clojuriano, aunque para ello deba aprender, además de Clojure, Emacs y Leiningen. Y para eso, el primer paso es instalar el entorno de desarrollo. En este caso, en un Mac.
Lo mismo que me propongo explicar yo aquí lo hace de forma excelente Ralf Bensmann aquí. Lo único que voy a hacer es traducir su post y adaptarlo un poco para explicar la instalación de ELPA y Leiningen (que él da por supuestas) y no explicar el debugger ni algún otro detalle.
Presuposiciones
- Java instalado
- ANT instalado
- Maven instalado
- GIT instalado
Descargar clojure y clojure-contrib
Se trata de descargar clojure y clojure-contrib y hacer la build de ambos:$ mkdir -p ~/thirdparty/clojure$ cd ~/thirdparty/clojure$ git clone http://github.com/clojure/clojure.git$ git clone http://github.com/clojure/clojure-contrib$ cd ..$ git clone git://github.com/GeorgeJahad/cdt.git$ cd clojure/clojure$ ant$ cd ../clojure-contrib$ mvn package
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 desde aquí
- Guardarlo en /bin (o cualquier otro directorio que esté en el PATH) como lein
$ chmod +x lein- Ejecutarlo una vez para que descargue dependencias que guardará en ~/.lein
Emacs: 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
Slime
Slime es un modo Emacs para el desarrollo LISP. Tal como indica su documentación, incluye, 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.
Instalar Slime
La forma mas sencilla de instalar Slime, según BestinClass.dk, detallada en este artículo, consiste en usar el gestor de paquetes Emacs ELPA:
-
Instalar ELPA:
M-x ielm- Escribir el siguiente código y pulsar, después, INTRO:
(let ((buffer (url-retrieve-synchronously "http://tromey.com/elpa/package-install.el"))) (save-excursion (set-buffer buffer) (goto-char (point-min)) (re-search-forward "^$" nil 'move) (eval-region (point) (point-max)) (kill-buffer (current-buffer)))) -
Acceder al listado de paquetes:
M-x package-list-packages -
Marcar con
Ilos paquetes que se quieren instalar. En nuestro caso,swank-clojure -
Ejecutar la instalación con
X
Finalmente nos quedará configurar emacs editando el fichero ~/.emacs (desde Emacs, recuerda, puedes usar C-x C-f para abrir un fichero) y añadiendo lo siguiente al final de todo:
;; Clojure, SLIME, Swank and CDT
(progn
;; Maven Repository
(setq mvn-dir "~/.m2/repository")
;; Clojure base directory
(setq clj-dir "~/thirdparty/clojure/clojure")
(setq clj-jar (format "%s/clojure.jar" clj-dir))
;; clojure-contrib
(setq clj-contrib-dir "~/thirdparty/clojure/clojure-contrib")
(setq clj-contrib-jar
(format "%s/target/clojure-contrib-1.2.0-SNAPSHOT.jar" clj-contrib-dir))
;; Load clojure-mode
(require 'clojure-mode)
;; Activate paredit-mode with clojure-mode
(add-hook 'clojure-mode-hook 'paredit-mode)
;; Swank
(setq swank-clojure-ver "1.2.1")
(setq swank-jar
(format "%s/swank-clojure/swank-clojure/%s/swank-clojure-%s.jar"
mvn-dir swank-clojure-ver swank-clojure-ver))
(setq swank-clojure-classpath
(list swank-jar clj-jar clj-contrib-jar))
(require 'swank-clojure)
(ad-activate 'slime-read-interactive-args)
;; Clojure syntax highlighting in REPL
(add-hook 'slime-repl-mode-hook 'clojure-mode-font-lock-setup)
;; CDT
(setq cdt-dir "~/thirdparty/cdt")
(setq cdt-source-path
(format "%s/src/jvm:%s/src/clj:%s/src/main/clojure"
clj-dir clj-dir clj-contrib-dir))
(load-file (format "%s/ide/emacs/cdt.el" cdt-dir)))
Desarrollo de un proyecto Clojure
Para desarrollar en Clojure será necesario configurar un proyecto en Leiningen con soporte de Swank, puesto que querremos inicar el servidor Swank con las mismas dependencias que tenga el proyecto ya configuradas. Para ello será necesario:
-
Crear un proyecto Leiningen:
lein new <nombre_proyecto> -
Editar
project.cljpara añadir las dependencias necesarias:(defproject learning-clojure "1.0.0-SNAPSHOT" :description "A tutorial project to learn Clojure" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"]] :dev-dependencies [[swank-clojure "1.2.1"]])- clojure-contrib para tener disponible esa librería en el proyecto
- swank-clojure para poder arrancar swank con las dependencias del proyecto (ver más abajo)
Iniciar un REPL y evaluar expresiones Clojure
Bensmann menciona la posibilidad de ejecutar Slime y Swank desde el propio Emacs, pero en Aquamacs (por lo menos en mi Mac) no funciona. Su segunda opción, que sí funciona, es ejecutar el servidor por un lado y el cliente por el otro.
- Ejecutar el servidor Swank (desde el directorio del proyecto):
$lein swank - Conectarse desde Emacs:
M-x slime-connect
Algunas cheat-sheets
Aprender Clojure, Leiningen y Emacs con Slime todo a la vez requiere mucha memoria (memoria humana, de la de toda la vida, no RAM). Así que unas cuantas cheat-sheets pueden ser útiles:
Conclusiones
Hemos visto como instalar un entorno de desarrollo para Clojure sobre Mac basado en Aquamacs (un Emacs) con Slime y Leiningen.
Mi siguiente paso es elegir un entorno de pruebas. Mi duda sigue siendo entre clojure.test y Midje. En cualquier caso, necesito familiarizarme con el nuevo entorno. Por ejemplo, ¿cómo ejecutar una prueba unitaria desde Aquamacs y ver si pasa o no?






