visual studio microsoft español descargar community namespaces clojure conventions project-organization

namespaces - microsoft - visual studio installer



¿Cuáles son las convenciones comunes para usar espacios de nombres en Clojure? (2)

Tengo problemas para encontrar buenos consejos y prácticas comunes para el uso de espacios de nombres en Clojure. Me doy cuenta de que los espacios de nombres no son lo mismo que los paquetes de Java, así que estoy tratando de desentrañar las convenciones en Clojure, que parecen sorprendentemente difíciles de determinar.

Creo que tengo una idea bastante clara de cómo dividir funciones en archivos clj e incluso, aproximadamente, cómo me gustaría organizar esos archivos en directorios. Pero más allá de eso tengo problemas para encontrar la mecánica para mi entorno de desarrollo. Algunas preguntas interrelacionadas:

  1. ¿Utilizo las mismas convenciones de exclusividad para los espacios de nombres de Clojure que normalmente usaría para los paquetes de Java? [es decir, backwards-company-domain.project.subsystem]
  2. ¿Debo guardar mis archivos en una estructura de directorios que coincida con mis espacios de nombres? [ala Java]
  3. Si tengo varios espacios de nombres, ¿necesito compilar todo mi código en un archivo jar y agregarlo a mi classpath para que sea accesible?
  4. ¿Debería cada espacio de nombres compilarse en un tarro? ¿O debería crear un solo jar que contenga código clj de muchos espacios de nombres?

Gracias...


  1. Estrictamente hablando, no es necesario, aunque muchos proyectos Java también han eliminado esa convención, especialmente para proyectos internos o API privadas. Sin embargo, evite los espacios de nombres de un solo segmento, lo que resultaría en la generación de archivos de clase en el paquete predeterminado.
  2. Sí.

Con respecto a 3 y 4, el empaquetado y la compilación AOT son completamente ortogonales a la cuestión de las convenciones de espacio de nombres.


  1. Supongo que está bien si crees que es útil, pero muchos proyectos de Clojure no lo hacen. Compojure (usando un compojure ns de nivel superior y varios compojure. * Ns para una funcionalidad específica), Ring, Leiningen ... Clojure usa clojure. * (Y clojure.contrib. * Para bibliotecas contrib), pero ese es un caso especial Supongo.

  2. ¡Sí! Es absolutamente necesario que lo hagas, de lo contrario, Clojure no podrá encontrar tus espacios de nombres. También tenga en cuenta que no debe usar el guión bajo en los nombres de espacio de nombres o el guión en los nombres de archivo y donde quiera que use un guión en el nombre de espacio de nombres, debe usar un guión bajo en el nombre de archivo (para que el my.cool-project ns my.cool-project se defina en un archivo llamado cool_project.clj en un directorio llamado my ).

  3. Debe asegurarse de que todas sus cosas estén en la ruta de clase, pero no importa si está en un frasco, varios frascos, una mezcla de frascos y directorios en el sistema de archivos ... Siempre que cumpla con las convenciones de nombres correctas ( tu punto no. 2) deberías estar bien.

    Sin embargo, no compile las cosas con anticipación si no hay una razón particular para hacerlo; esto puede evitar que su código sea portátil en varias versiones de Clojure sin proporcionar ningún beneficio, además de un tiempo de carga ligeramente mejorado.

    Aún tendrá que usar la compilación AOT a veces, especialmente en algunos escenarios de interoperabilidad de Java: la documentación de las funciones / macros relevantes siempre lo menciona. Hay ejemplos de cosas que requieren AOT en clojure.contrib; Nunca lo he necesitado, por lo que no puedo proporcionar muchos detalles.

  4. Yo diría que deberías usar tarros para unidades funcionales de código. Por ejemplo, Compojure y Ring se empaquetan como frascos individuales que contienen muchos espacios de nombres que juntos componen todo el paquete. Además, clojure.contrib está especialmente empaquetado como un solo contenedor con múltiples bibliotecas no relacionadas; Pero eso puede ser de nuevo un caso especial.

    Por otro lado, un solo frasco que contiene todo el código de su proyecto junto con sus dependencias puede ser útil para la implementación. Echa un vistazo a la herramienta de construcción Leiningen y su función ''uberjar'' si crees que ese tipo de cosas te pueden ser útiles.