2010-06-06 15 views
28

Estoy desarrollando un proyecto de mascotas con Clojure, pero me pregunto si puedo acelerar un poco mi flujo de trabajo.¿Flujo de trabajo eficiente de Clojure?

Mi flujo de trabajo actual (con Compojure) es:

  1. inicio Swank con lein swank.
  2. Vaya a Emacs, conéctese con M-x slime-connect.
  3. Cargue todos los archivos fuente existentes uno por uno. Esto también inicia un servidor Jetty y una aplicación.
  4. Escriba un código en REPL.
  5. Cuando esté satisfecho con los experimentos, escriba una versión completa de una construcción que tenía en mente. Eval (C-c C-c).
  6. Cambie REPL al espacio de nombre donde reside este constructo y pruébelo.
  7. Cambie al navegador y vuelva a cargar la pestaña del navegador con la página afectada.
  8. Modifique el código, evalúelo, consulte el navegador.
  9. Repita cualquiera de las anteriores.

Hay una serie de molestias con ella:

  1. tengo que cambiar entre Emacs y el navegador (o navegadores si estoy probando cosas como plantillas con múltiples navegadores) todo el tiempo. ¿Hay un idioma común para automatizar esto? Solía ​​tener un bit de JavaScript que recarga la página continuamente, pero tiene una utilidad limitada, obviamente, cuando tengo que interactuar con la página por más de unos pocos segundos.
  2. Mi instancia de JVM se vuelve "sucia" cuando experimento y escribo funciones de prueba. Básicamente, los espacios de nombres se contaminan, especialmente si estoy refactorizando y moviendo las funciones entre espacios de nombres. Esto puede provocar colisiones de símbolos y necesito reiniciar Swank. ¿Puedo undef un símbolo?
  3. Cargo todos los archivos fuente uno por uno (C-c C-k) al reiniciar Swank. Sospecho que lo estoy haciendo todo mal.
  4. Cambiar entre REPL y el editor de archivos puede ser un poco irritante, especialmente cuando tengo muchas pestañas de Emacs abiertas, junto con los navegadores.

Estoy buscando maneras de mejorar los puntos anteriores y todo el flujo de trabajo en general, por lo que agradecería que compartiera el suyo.

P. S.

También he utilizado Vimclojure antes, por lo que los flujos de trabajo basados ​​en Vimclojure también son bienvenidos.

Respuesta

19

no una descripción completa del flujo de trabajo, sólo algunas ideas:

  1. Es posible eliminar un VAR de un espacio de nombres con la función ns-unmap. Para mayor conveniencia, se puede construir una macro undef encima, p. Ej. de este modo:

    (defmacro undef [& syms] 
        `(do [email protected](map (fn [s] `(ns-unmap *ns* '~s)) syms))) 
    

    ns-unalias también pueden ser de interés.

  2. No hay ninguna razón para revisar los archivos que contienen los espacios de nombre para hacer C-c C-k en cada uno de ellos; puede simplemente require los espacios de nombres que necesita en REPL.

    Por otra parte, si escribe algunos caracteres en el limo REPL y luego usar M-p/M-n para navegar historia, sólo se mostrarán las entradas que coinciden con el bit inicial del texto que escribió con la mano. Esto es compatible con Paredit (el (los) soporte (s) de cierre posterior (s) no serán un problema). Por lo tanto, si crea un gran requerimiento al inicio - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) - luego de reiniciar Swank, todo lo que necesita hacer es escribir algo como (require '[f y presionar M-p para traer ese formulario al indicador REPL nuevamente.

    Es cierto que esto podría automatizarse de varias maneras (por ejemplo, teniendo la Swank REPL búsqueda de un archivo de configuración, o una simple macro expandiéndose en un formulario require apropiado que podría usarse después de traer solo un espacio de nombres de utilidad de el proyecto, especialmente la última idea, sería fácil de implementar), pero considero que es lo suficientemente bajo en cuanto al factor de molestia que hasta ahora no me he molestado con ninguna mejora.

  3. Puede utilizar C-c C-z para hacer una ventana con la baba REPL pop-up mientras se encuentra en un búfer habilitado para BABA. Además, debe intentar usar ido si aún no lo ha hecho. Tiendo a trabajar con un búfer de código abierto en una ventana en el lado izquierdo de la pantalla y un búfer REPL a la derecha; con windmove-left y windmove-right vinculado a algunas teclas convenientes, tiendo a ser muy feliz. Si necesito mirar buffers adicionales con frecuencia, uso marcos adicionales de Emacs.

  4. Por cierto, yo no uso lein swank normalmente, prefiero mi función personalizada clojure-project (una versión modificada del original de Phil Hagelberg). En ocasiones, siento el deseo de mejorarlo ... tal vez me ocuparé de la automatización por proyecto import/require la próxima vez que eso ocurra. ;-)

5

no estoy seguro acerca de Lein, pero en Maven puede especificar el nombre del script repl (replScript config param), que permite especificar qué comandos se ejecutan en el arranque de REPL & Swank ... Y si tiene espacio de nombres separado para su proyecto, puede usar las funciones de clojure.contrib.find-namespaces para buscar sus espacios de nombres y cargarlos todos ...