2009-10-23 11 views
18

He estado usando Clojure por un tiempo y quiero crear algunos proyectos que son más grandes y más complicados que los juguetes. He estado usando Java durante los últimos años y me he acostumbrado a lo que los IDEs hacen por mí: compilar muchas clases, empaquetarlas en frascos, crear archivos por lotes para que los usuarios los inicien.Desarrollo de Clojure: ¿IDE o REPL?

Cuando miro ejemplos de desarrollo en Clojure, parecen estar en la línea de cargar archivos en el REPL, ver cómo funcionan, editar el archivo, volver a cargar, repetir. Nary una clase o jar se genera en cualquier lugar. En la excelente "Programación Clojure" de Stuart Halloway, no pude encontrar un solo ejemplo de ": gen-class", por ejemplo. Los IDEs de Clojure que he usado (ClojureBox y el plugin encwelure de NetBeans) parecen promover ese mismo flujo de trabajo.

¿Esto es intencional? ¿Las herramientas son demasiado inmaduras o simplemente no las "entiendo"?

Me gustaría escuchar algunos ejemplos de flujo de trabajo de personas que han creado algunos programas no triviales para ser utilizados por usuarios regulares (no otros desarrolladores) si es posible.

Gracias por compartir sus opiniones.

+0

Si desea entregar un frasco-archivo en el usuario final, sólo tiene que utilizar 'Lein uberjar'. Todavía usaría el REPL para construir el programa, pero un usuario final no debería tener que usar el REPL para usar el programa. –

Respuesta

12

creo que en realidad hay 2 preguntas aquí:

A) de cómo implementar (y construir y gestionar las dependencias). Todo lo que puedo decir es mirar otros proyectos con objetivos/dominios similares y copiarlos.

B) Flujo de trabajo:

Mi flujo de trabajo es la siguiente:

  1. abrir un archivo y escribir algunas declaraciones Ilusiones de alto nivel de inicio

  2. escribir algunas funciones para apoyarlo

2.5 copie las definiciones de funciones a REPL como Creo que

  1. abrir otro archivo y escribir algunas pruebas básicas para comprobar la función funciona

3,5 copia éstos al REPL

  1. iterar entre los dos almacenamientos intermedios que construyen las pruebas hasta un ejemplo y el programa hacia un objetivo final. Con el tiempo, se convierten en actividades similares y sé que he terminado.

  2. enrolle el archivo secundario en deftest

Ahora cuando vuelva en un mes, sólo puede ejecutar mis pruebas y ser feliz! Guardar sus búferes REPL puede proporcionar algún valor con poco esfuerzo. Eso es lo que funciona para mí en este momento, y estoy feliz de haber sido educado para mejores enfoques.

En cuanto a la selección de IDE frente a REPL, la mayoría de los IDE tienen complementos que tienen REPL, así que no estoy seguro de que sea una u otra opción, realmente es sobre qué editor de texto eres productivo y cómo quieres administrar su estructura de proyecto No hay estructuras de "hazlo así" prefabricadas AFAIK, por lo que en este punto es más fácil ver proyectos específicos (como Clojure en sí, o penumbra o compojure o cualquiera de las bibliotecas listadas en el sitio principal.

+1

Si su editor admite el envío de código a REPL, entonces puede deshacerse de copiar y pegar (Emacs, vim con vim-fireplace, lighttable). –

9

La mayoría de los IDE de la familia LISP (y otros lenguajes funcionales) han alentado el enfoque de desarrollo REPL durante mucho tiempo. Algunos de estos REPL también cuentan con las funciones de autocompletar que puede asociar con un IDE de Java.

REPL le ofrece un par de ventajas importantes sobre el enfoque estándar. La primera es que le permite ejecutar código arbitrario durante el tiempo de ejecución de su programa, lo que puede hacer que la depuración de sistemas de subprocesos múltiples sea mucho más simple. En segundo lugar, y más importante, hace que sea fácil probar tus funciones mientras codificas. No es necesario crear un marco alrededor de una nueva función o clase, puede jugar con él directamente en REPL y ver cómo responde a una variedad de casos de uso.

6

Bueno, para comenzar, prácticamente cualquier complemento de desarrollo decente para cualquier editor o IDE le dará una forma de usar Clojure REPL desde dentro del IDE. Probablemente incluso le permita cargar archivos en el REPL para realizar pruebas y cosas por el estilo. No es necesario elegir uno u otro.

En realidad, la mayoría de las personas están perfectamente satisfechas con el uso de Emacs, incluido yo mismo. Emacs utiliza un Lisp como lenguaje de configuración, por lo que por lo general, es la opción más natural para un Lisper.

Para los idiomas que tienen REPL, el uso de REPL como parte principal del proceso de desarrollo es la norma. Editando archivos, cargándolos en el REPL, jugando con ellos para ver si funciona, enjuague, repita. Esta es una de las principales ventajas de los lenguajes con REPL como Clojure, Haskell, CL y demás.

En cuanto a la construcción de jarras, y la compilación del código de Clojure y esas cosas, es simple. Ni siquiera realmente/tienes/para compilar el código Clojure la mayoría del tiempo si no quieres. Cuando lo haces, lo compilas con gen-class, que lo compila en archivos de clase que luego puedes poner en un jar. Hay toneladas de ejemplos e incluso tutoriales distribuidos entre las redes internas. La forma más fácil y más eficiente es usar algo como Ant y escribir un script de compilación que compila el código de Clojure y genera el .jar por usted. La primera vez que lo hice, pensé que iba a ser difícil de hacer, pero en realidad fue muy simple. Solo miré los archivos de compilación Clojure y Clojure-Contrib Ant, y mencioné las páginas de ayuda de Ant para todo lo demás que necesitaba.

Una cosa que debo mencionar es el hecho de que Enclojure/does/build realmente archivos .jar ejecutables para usted, si usted lo solicita. Estoy seguro de que se agregarán cosas más avanzadas a las que está acostumbrado en el futuro. De hecho, todavía son bastante nuevos.

4

Uso ambos: Eclipse IDE y el complemento Counterclockwise que proporciona un REPL. Esta es una combinación particularmente buena si desarrolla código Java junto con Clojure (como yo).

Mi enfoque general es:

  • Escribir código Clojure en el editor
  • Mantenga un REPL abierto para probar cosas fuera (Ctrl + Enter es un atajo útil en este caso: se ejecuta cualquier código que se ha seleccionado en su editor en el REPL)
  • Use las herramientas IDE genéricos para la gestión de proyectos, construcción, pruebas, etc. SMC

a veces, también trabajan puramente en el REPL. Esto generalmente es mejor para probar cosas rápidamente. Si me gusta especialmente un fragmento de código de prueba, simplemente lo copiaré/pegaré de REPL en mi suite de pruebas.

0

"Cuando miro ejemplos de desarrollo en Clojure que parecen ser a lo largo de las líneas de cargar archivos en el REPL, ver cómo funcionan, editar el archivo, vuelva a cargar, repetir. Siendo generados Nary una clase o un tarro en cualquier lugar ... Me gustaría escuchar algunos ejemplos de flujo de trabajo de personas que han creado algunos programas no triviales para ser utilizados por usuarios regulares (no por otros desarrolladores) si es posible ".

Los ejemplos en Debugging clojure functions which are invoked in java code (eclipse) son triviales, pero ilustran cómo en Eclipse uno puede vincular proyectos tales que uno puede invocar la funcionalidad clojure/scala desde dentro de java.

1

Con Eclipse, puede ejecutar pruebas unitarias (o cualquier programa) cada vez que guarde un archivo en el proyecto. Todo el proceso lleva menos de un segundo: es genial para el desarrollo basado en pruebas y elimina la necesidad de cortar y pegar en el REPL para la mayoría de las situaciones. ¡Además puedes mantener las pruebas! :-)

Querrá usar cake para evitar el tiempo de inicio de JVM cada vez que inicie sus pruebas. Puede ejecutar cake test en la línea de comandos, o simplemente hacer que Eclipse lo ejecute cuando guarde cualquier archivo en su proyecto.

Lo hice funcionar configurando un proyecto con Leiningen, instalando cake, e instalando el counterclockwise plugin de Eclipse. Para configurar Eclipse para ejecutar pruebas cada vez que guarde, seleccione Proyecto-> Propiedades-> Constructores, haga clic en Nuevo, seleccione Programa, llámelo algo así como 'ejecutar pruebas', agregue la ruta al cake en Ubicación, seleccione el Directorio de trabajo para su proyecto, y agregue test a los argumentos opcionales. En la pestaña "Opciones de compilación", selecciona "Durante las compilaciones automáticas".

Obtuve la idea general para esto del libro de Jeff Younker, "Fundamentos del desarrollo ágil de Python". He sido un hombre de Emacs durante 20 años, pero este truco ha puesto a Eclipse al frente de mi flujo de trabajo últimamente.


Actualización: aproximadamente un año más tarde, ahora uso Midje con la opción lazytest a hacer lo mismo mientras se desarrolla tanto con Emacs y Eclipse.

1

Lo que hago es crear un proyecto con Leiningen. Si solo desea desconectarse durante un tiempo, puede escribir lein repl y su classpath del proyecto se configurará para esa réplica.

En realidad, uso Emacs, slime y swank clojure. Después de navegar hasta el proyecto, simplemente escriba M-x clojure-jack-in. Esto inicia el servidor swank y el limo se conecta a él y usted tiene una réplica en un búfer. Por supuesto, eso no vale más que ejecutar un repl en un shell. Lo que obtienes es la capacidad de escribir código en otro buffer, y con un keybinding seleccionar sexps o unidades más grandes y ejecutarlas en el repl para ver si funciona. También limo te proporciona útiles combinaciones de teclas para tareas comunes. Ver swank-clojure en github para más información.

JohnJ, Usted puede hacer lo mismo en Emacs. En realidad, esa frase es probablemente una tautología.

(add-hook 'after-save-hook etc. 

Aquí está el ejemplo de alguien después de ahorro-gancho para git: https://gist.github.com/449668

Cuestiones relacionadas