Pregunta

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 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 fantástico "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.

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

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 tus opiniones.

¿Fue útil?

Solución

Creo que hay realmente 2 preguntas aquí:

A) cómo implementar (y crear 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í:

  1. abra un archivo y escriba algunas declaraciones de alto nivel de ilusión

  2. comienza a escribir algunas funciones para admitirlo

2.5 copie las definiciones de funciones a REPL a medida que las creo

  1. abra otro archivo y escriba algunas pruebas básicas para verificar que la función funcione

3.5 copia esto en el REPL

  1. itere entre los dos buffers construyendo las pruebas hasta un ejemplo y el programa hacia una meta final. Con el tiempo, se convierten en actividades similares y sé que ya he terminado.

  2. envuelve 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 justo lo que me funciona en este momento, y estoy feliz de ser educado para obtener 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 administrar la estructura de su proyecto. No hay ninguna estructura 'hecho 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 enumeradas en el sitio principal). p>

Otros consejos

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.

Bueno, para comenzar, prácticamente cualquier complemento de desarrollo decente para cualquier editor o IDE le dará una forma de utilizar el REPL de Clojure desde el IDE. Probablemente incluso le permita cargar archivos en el REPL para pruebas y demás. No es necesario 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 funciona, 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 los interwebs. 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 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.

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:

  • Escriba el 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)
  • Use 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 las 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.

Lo que hago es crear un proyecto con Leiningen. Si solo quieres eliminar por un tiempo, solo tienes que escribir lein repl y la ruta de clase 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 M-x 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. También el limo te da combinaciones de teclas útiles para tareas comunes. Consulte swank-clojure en github para obtener 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-enganchar para git: https://gist.github.com/449668

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 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.

Conseguí que esto funcionara configurando un proyecto con Leiningen , instalando cake , e instalando el a la izquierda 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 como 'ejecutar pruebas', agregue la ruta a 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, "Foundations of Agile Python Development". 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 perezosa para hacer lo mismo mientras se desarrolla con Emacs y Eclipse.

  

" 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, recargar, repetir. No es posible que se genere 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 que los usen los usuarios regulares (no otros desarrolladores) si es posible. & Quot;

Los ejemplos en Funciones de depuración de objetos invocados en java code (eclipse) son triviales, pero ilustran cómo en eclipse uno puede vincular proyectos de tal manera que se pueda invocar la funcionalidad clojure / scala desde java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top