tutorial online framework example clojure

online - ¿Cómo aplicar Clojure?



clojure web framework (5)

La programación funcional se puede aplicar a casi cualquier tarea. Aplicaciones web, aplicaciones científicas, juegos, lo que sea.

Es muy común mezclar Clojure y Java, ya que Clojure no tiene muchas bibliotecas dedicadas para cosas como E / S o redes.

Las organizaciones que ya tienen mucho código Java pueden usar Clojure para pequeñas subsecciones de sus proyectos Java.

Para los proyectos nuevos, generalmente es más efectivo usar Clojure como el lenguaje de controlador de alto nivel, llamando bibliotecas de Java cuando sea necesario.

Estoy aprendiendo Clojure y realmente amo algunas de sus características. Es hora de pensar en algunos "proyectos favoritos" reales y me doy cuenta de que no estoy seguro de cómo usar Clojure.

Veo muchos frameworks web y de plantillas (por ejemplo, Compojure), pero de alguna manera tengo dudas sobre si vale la pena. Siento que a la larga no puede satisfacer las necesidades de las aplicaciones del mundo real a las que se dirige con Spring, Hibernate y algunas piezas de la pila Java EE.

Por otro lado, veo un gran potencial en las funciones de concurrencia, pero tengo pocas ideas sobre cómo usarlas realmente.

Bastante de fondo, mis preguntas son:

  • ¿Cuáles son las aplicaciones factibles de Clojure y la programación funcional? ¿Qué idea para un proyecto de mascota puede sugerir que no sería reescribir las cosas que hice con OO / Java EE en sintaxis diferente? Estoy buscando algo que realmente explote el potencial de Clojure y conduzca a una solución que se siente mucho mejor (no solo en sintaxis) que la programación OO / estructural.
  • ¿Es común, o al menos razonable, mezclar Clojure y Java? Me refiero a utilizar Clojure para bibliotecas pequeñas en proyectos con un 95% de Java o crear aplicaciones Java sobre el núcleo escrito en Clojure.

Editar : Gracias por todas las excelentes respuestas. Todos son realmente inspiradores. Entonces, si tiene algo más que agregar, siga adelante y no se deje intimidar por el hecho de que uno haya sido aceptado.


He estado trabajando en una pequeña aplicación web usando Clojure, y aunque no hay nada especial acerca de la aplicación que no se podría haber hecho en un idioma diferente, la experiencia de escribirlo ha sido completamente diferente. He escrito aplicaciones web usando ASP.net y mudarme a Clojure fue menos sobre aprender la sintaxis diferente y más sobre aprender una manera diferente de pensar y programar. Tener que aprender una forma diferente de pensar ocurrirá independientemente del proyecto en el que elija trabajar, por lo que me preocuparía menos por encontrar el proyecto funcional perfecto y más por encontrar algo en lo que quiera trabajar.


Creo que la respuesta a esto tiene mucho que ver con el contexto en el que está incrustado su proyecto y las limitaciones que se le imponen. Factores sociales ausentes Creo que Clojure es, al menos, tan "bueno" como Java para cualquier problema, con la posible excepción de casos en los que necesita el último rendimiento. E incluso en esos casos las cosas no son tan simples como parecen. Por un lado, una versión futura de Clojure puede, probablemente, en el límite teórico, compilarse en bytecode que es tan "rápido" como en qué se compila Java (asumiendo un poco más de trabajo del programador en los cuellos de botella). Más importante aún, la optimización es un problema multifactorial, y uno en el cual la productividad del programador y la flexibilidad de los factores de código pesan mucho. Entonces, aunque hay un sentido en el que sería correcto decir que Clojure es más lento que Java, ese sentido podría no ser el más importante cuando se discute el rendimiento de una aplicación en particular.

Así que diría que si se ignoran los factores sociales, los casos de uso de Clojure se aproximan a un superconjunto de Java. Sin embargo, no intentaría escribir un módulo kernel de Linux en clojure ...

Por supuesto, es verdad que no todos los problemas tienen soluciones igualmente naturales en los lenguajes funcionales. Pero la gente ha encontrado algunas formas interesantes de lidiar con algunos de los casos en los que FP parece mapearse mal en el dominio, y de todos modos Clojure realmente te ofrece suficientes escapes de escape de FP puro que si realmente sientes la necesidad de escribir parte de tu programa en un estilo imperativo que puedas (aunque, por supuesto, renunciarás a algunos de los beneficios de Clojure en ese caso). En el peor de los casos, podrías usar Clojure para manejar la biblioteca Java de la misma manera que lo harías en Java. . Es difícil imaginar un caso en el que sería una buena idea, pero en la mayoría de los casos eso no sería notablemente inferior al uso de Java, y en muchos podría ser mejor.

Todavía soy un neófito en Clojure, aunque he estado programando en CL y en un esquema durante mucho tiempo, y pasé unos cinco años escribiendo Java para ganarme la vida. Pero probablemente preferiría Clojure a Java para casi cualquier cosa, incluso sin saberlo, siempre y cuando no haya factores sociales involucrados.

Sin embargo, sería un error descartar los factores sociales. He sido programador de Lisp el tiempo suficiente para tener un instinto finamente perfeccionado de cuán bien funcionará un Lisp en un contexto determinado. Introduje Lisp en entornos comerciales donde ha sido una gran victoria, y lo he introducido en entornos en los que realmente no lo era. Pensaría largo y tendido en apostar en su carrera para lograr la transición exitosa de un equipo de programadores a cualquier Lisp, Clojure incluido, particularmente si no están muy interesados ​​en la idea.

Solo para darte una idea de lo que creo que Clojure podría ser útil, actualmente estoy escribiendo mucho código relacionado con el poker en Clojure. Algo de eso es bastante simple (encontrar la mejor mano de cinco cartas que puedas obtener de siete cartas) y algo más interesante (mirar el historial de juego de alguien y extraer tendencias significativas de él usando algunas heurísticas y algunas estadísticas básicas) .) Nada de esto requiere mucho en el camino de los sofisticados mecanismos de concurrencia de Clojure, pero todavía es mucho más agradable (al menos para mí) en Clojure de lo que sería en, digamos, Java.

Ciertamente, hay otros casos en los que alguien podría describir en qué parte de Clojure gana mucho debido a sus sofisticados mecanismos para gestionar la concurrencia, etc. Me refiero a algo más modesto. Solo señalo que incluso si no necesita esos mecanismos, podría hacerlo. encuentre a Clojure como un lenguaje muy agradable para la programación de propósito general, aunque requiera que reconsidere cómo abstrae las cosas si proviene de un fondo imperativo / OO. Y oye, si necesitas los mecanismos de concurrencia (como es lógico, la forma en que van las cosas), al menos ya conoces a Clojure.


Me gusta escribir programas de juegos cuando aprendo un nuevo idioma.

Estoy en el proceso de aprender Clojure y comencé a escribir un Spider Solitaire Player. Si nunca jugaste a Spider, no comiences; es muy aditivo :-). Ver http://www.spidersolitaire.org/ .

Al escribir este juego, estoy usando varias cosas que quiero aprender: programación funcional, concurrencia, interoperabilidad Java (para Swing), etc.

También comencé a escribir un jugador de Bejeweled ( http://www.popcap.com/games/free/bejeweled2 ), pero me he encontrado con un problema para encontrar las reglas definitivas para anotar el juego.


En respuesta a la parte de "fondo" de la pregunta:

Creo que deberías leer la respuesta de Jörg W. Mittag a una pregunta SO titulada "Programación Haskell del mundo real". Él hace una serie de excelentes puntos. Siga leyendo para mi opinión sobre la PF en el tema del mundo real; desplazarse más allá de la línea horizontal para obtener respuestas a las dos preguntas reales.

Hay varias empresas centradas en la PF que parecen ser realmente buenas en lo que hacen; para algunos ejemplos, google Jane Street (OCaml), Galois (Haskell), FlightCaster (Clojure para el levantamiento pesado de back-end; me parece recordar haber leído que su interfaz está actualmente hecha en Rails). Las estrategias de trading supuestamente automatizadas a menudo se codifican en lenguajes orientados a FP; eso tendría mucho sentido, aunque no tengo datos internos para confirmarlo. Para ver ejemplos adicionales de Clojure, consulte la lista de empresas en la página de historias de éxito .

Algunas personas parecen estar disfrutando de un grado de éxito al abordar las necesidades de las aplicaciones del mundo real en Rails, Django, etc. Parece que no sienten la necesidad de tocar J2EE y sus amigos. No es que tengan mucho que ver con FP, pero son como FP en el sentido de que no se parecen en nada a los "lenguajes empresariales" del presente.

En cuanto a las dos preguntas reales:

¿Por qué no simplemente recoges lo que sea que has pensado hacer por última vez y lo haces en Clojure? Obviamente, se puede hacer cualquier cosa en Java (y la mayoría de las cosas probablemente lo hayan sido), pero un lenguaje más simple podría hacer que el producto sea más limpio, la experiencia más placentera y menos lenta, etc.

Acerca de la mezcla de Clojure y Java: he visto una cantidad decente de código Clojure usando un par de clases codificadas directamente en Java (por el motivo que sea). Intenté darme la vuelta al revés y me duele un poco que trabajar con la herencia de interfaz sea mucho más simple que la herencia de clases en Clojure, el acoplamiento inesperado en el código de Java puede interferir seriamente con la capacidad del código de Clojure para hacer las cosas de la manera más natural, etc. Aún así, es completamente posible extender un programa Java en Clojure y parece una forma particularmente segura y sensata de experimentar con él para el desarrollador preocupado de Java.