que - Desarrollo de Clojure: IDE o REPL?
repl que es (7)
"Cuando veo ejemplos de desarrollo en Clojure, parecen estar en la línea de los archivos de carga en el REPL, ver cómo funcionan, editar el archivo, volver a cargar, repetir. No hay una clase o un tarro que se genere en cualquier lugar ... "Me gustaría escuchar algunos ejemplos de flujo de trabajo de personas que han creado algunos programas no triviales para ser usados por usuarios regulares (no otros desarrolladores) si es posible".
Los ejemplos en Debugging clojure funciones que se invocan en el código java (eclipse) son triviales, pero ilustran cómo en el eclipse se pueden vincular proyectos de tal manera que se pueda invocar la funcionalidad clojure / scala desde java.
He estado usando Clojure por un tiempo y quiero crear algunos proyectos 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 hacen los IDE por mí: compilar muchas clases, empaquetarlas en tarros, crear archivos de proceso por lotes para que los usuarios los comiencen.
Cuando veo ejemplos de desarrollo en Clojure, parecen estar en línea con los archivos de carga en el REPL, ver cómo funcionan, editar el archivo, recargar, repetir. Ninguna clase o tarro se genera en ninguna parte. En el genial "Programming Clojure" de Stuart Halloway no pude encontrar un solo ejemplo de ": gen-class", por ejemplo. Los IDE de Clojure que he usado (ClojureBox y el complemento NetBeans de enclojure) parecen promover ese mismo flujo de trabajo.
¿Es esto intencional? ¿Son las herramientas 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.
Bueno, para comenzar, virtualmente cualquier complemento de desarrollo decente para cualquier editor o IDE le dará una forma de usar el REPL de Clojure desde el IDE. Probablemente incluso te permita cargar archivos en el REPL para pruebas y demás. No necesitas elegir uno u otro.
Enclojure va por un largo camino, eso es seguro. Sin embargo, la mayoría de las personas están perfectamente contentas con el uso de Emacs, incluyéndome a mí. Emacs usa un Lisp como idioma de configuración, por lo que generalmente es la opción más natural para un Lisper.
Para los idiomas que tienen REPL, usar la REPL como una parte importante del proceso de desarrollo es la norma. Editar archivos, cargarlos en el REPL, jugar con ellos para ver si un trabajo, enjuague, repita. Esta es una de las principales ventajas de los lenguajes con REPL como Clojure y Haskell y CL y similares.
En cuanto a la construcción de frascos y la compilación de código Clojure y esas cosas, eso es simple. Ni siquiera tiene / tiene / compilar el código de Clojure la mayor parte del tiempo si no lo desea. Cuando lo hagas, AOT lo compila con gen-class, que lo compila en archivos de clase que luego puedes poner en un jar. Hay toneladas de ejemplos e incluso tutoriales repartidos entre las redes. La forma más fácil y eficiente es usar algo como Ant y escribir un script de compilación que compile el código de Clojure y genere el .jar para ti. La primera vez que lo hice, pensé que iba a ser difícil de hacer, pero en realidad era muy simple. Acabo de ver los archivos de compilación Clojure y Clojure-Contrib Ant, y he consultado las páginas de ayuda de Ant para todo lo que necesitaba.
Una cosa que debo mencionar es el hecho de que Enclojure / does / realmente construye archivos .jar ejecutables para usted, si así lo solicita. Estoy seguro de que las cosas más avanzadas a las que está acostumbrado se agregarán en el futuro. De hecho, son bastante nuevos.
Con Eclipse, puede hacer que se ejecuten pruebas de unidad (o cualquier programa) cada vez que guarde un archivo en el proyecto. El proceso completo toma menos de un segundo: es ideal para el desarrollo guiado por pruebas y elimina la necesidad de cortar y pegar en el REPL para la mayoría de las situaciones. ¡Además te quedas con las pruebas! :-)
Querrá usar la torta para evitar el tiempo de inicio de JVM cada vez que inicie sus pruebas. Puede ejecutar la cake test
en la línea de comandos, o simplemente hacer que Eclipse lo ejecute cuando guarde cualquier archivo en su proyecto.
Conseguí que esto funcionara al configurar un proyecto con Leiningen , instalar Cake e instalar el complemento Eclipse en counterclockwise las counterclockwise del counterclockwise . Para configurar Eclipse para ejecutar pruebas cada vez que guarde, seleccione Proyecto-> Propiedades-> Constructores, haga clic en Nuevo, seleccione Programa, llámelo algo como ''ejecutar pruebas'', agregue la ruta a la cake
en Ubicación, seleccione el Directorio de trabajo para su Proyecto, y añadir 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 después, ahora uso Midje con la opción más perezosa para hacer lo mismo mientras se desarrolla con Emacs y Eclipse.
Creo que hay realmente 2 preguntas aquí:
A) cómo implementar (y construir y gestionar 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 así:
abrir un archivo y escribir algunas declaraciones de alto nivel de ilusión
Empieza a escribir algunas funciones para soportarlo.
2.5 Copie las definiciones de funciones a REPL cuando las creo.
- abre otro archivo y escribe algunas pruebas básicas para verificar que la función funcione
3.5 copiar estos a la REPL
iterar entre los dos buffers construyendo las pruebas hasta un ejemplo y el programa hacia una meta final. Estas eventualmente se convierten en actividades similares y sé que he terminado.
envolver el archivo secundario en más fuerte
Ahora, cuando vuelvo en un mes, ¡solo puedo realizar mis pruebas y ser feliz! Guardar sus buffers REPL puede proporcionar algo de valor con poco esfuerzo. Eso es lo que funciona para mí en este momento, y estoy feliz de ser educado para lograr mejores enfoques.
En cuanto a la selección de IDE frente a REPL, la mayoría de los IDE tienen complementos que tienen REPL, por lo que no estoy seguro de que sea una opción u otra; en realidad, se trata del editor de texto en el que eres productivo y de cómo quieres gestionar la estructura de tu proyecto . No hay ninguna estructura de "hágalo de esta manera" pre-hecha de AFAIK, por lo que en este punto es más fácil ver proyectos específicos (como Clojure, Penumbra o Compojure o cualquiera de las bibliotecas que figuran en el sitio principal).
El enfoque de desarrollo de REPL ha sido fomentado por la mayoría de los IDE de familias de LISP (y otros lenguajes funcionales) durante mucho tiempo. Algunos de estos REPL también incluyen las funciones de autocompletado que puede asociar con un IDE de Java.
REPL le ofrece algunas 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 múltiples subprocesos sea mucho más sencilla. En segundo lugar, y más importante, facilita la prueba de sus funciones mientras usted codifica. No necesita crear un marco alrededor de una nueva función o clase, puede jugar con él directamente en el REPL y ver cómo responde a una variedad de casos de uso.
Lo que hago es crear un proyecto con Leiningen. Si solo desea eliminar por un tiempo, puede simplemente escribir lein repl y su classpath del proyecto se configurará para esa respuesta.
En realidad, sin embargo, uso Emacs, limo y swank swank. Después de navegar al proyecto, simplemente escriba Mx clojure-jack-in . Esto inicia el servidor swank y slime se conecta a él y tiene una respuesta en un búfer. Por supuesto, solo eso no vale más que ejecutar una respuesta en un shell. Lo que obtienes es la capacidad de escribir código en otro búfer, y con un enlace de teclas, selecciona sexps o unidades más grandes y ejecútalos en la respuesta para ver si funciona. Además, el limo te brinda combinaciones de teclas útiles para tareas comunes. Ver swank-clojure en github para más información.
JohnJ, puedes 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 guardar el enganche para git: https://gist.github.com/449668
Uso ambos, el complemento Eclipse IDE y Counterclockwise que proporciona un REPL. Esta es una combinación particularmente agradable si desarrollas código Java junto con Clojure (como hago yo).
Mi enfoque general es:
- Escribir código de clojure en el editor.
- Mantenga un REPL abierto para probar cosas (Ctrl + Enter es un atajo útil aquí: ejecuta cualquier código seleccionado en su editor en el REPL)
- Utilice las herramientas IDE genéricas para la gestión de proyectos, construcción, pruebas, SCM, etc.
A veces, también trabajo exclusivamente en el REPL. Esto suele ser mejor para probar cosas rápidamente. Si me gusta un código de prueba en particular, simplemente lo copiaré / pegaré desde el REPL a mi conjunto de pruebas.