2010-08-16 12 views
23

Estoy aprendiendo Clojure y realmente amo algunas de sus características. Ahora es el momento de pensar en algunos "proyectos de mascotas" reales y me doy cuenta de que no estoy seguro de cómo usar realmente Clojure.¿Cómo aplicar 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 características de concurrencia, pero tengo pocas ideas sobre cómo usarlas realmente.

fondo suficiente, mis preguntas son:

  • ¿Cuáles son las aplicaciones posibles de Clojure y 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 grandes 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.

Respuesta

17

En respuesta al "fondo" parte de la pregunta:

creo que usted debe leer answer de Jörg W. Mittag a una cuestión de forma, titulado "mundo real Haskell programación". É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 una serie de 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 que lo confirmen. Para ver ejemplos adicionales de Clojure, consulte the list of companies on the success stories page.

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 & amigos. No es que estos tengan mucho que ver con FP, pero son como FP en que son nada como los "lenguajes de empresa" del presente.


En cuanto a las dos preguntas reales:

Por qué no sólo recoger lo que sea la última vez que has estado pensando que hacer y hacerlo 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 puede hacer que el producto sea más limpio, la experiencia más placentera y menos lenta.

Acerca de la mezcla de Clojure y Java - Tengo visto una buena cantidad de código Clojure usando un par de clases codificadas directamente en Java (por cualquier razón). Intenté darme la vuelta al revés y me duele un poco que trabajar con la herencia de la interfaz sea mucho más simple que la herencia de clase 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 manera segura de experimentar con el desarrollador Java preocupado.

9

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 de Java pueden usar Clojure para pequeñas subsecciones de sus proyectos de Java.

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

+4

Me gustaría añadir que, aunque al principio las desagradables GUIs de Swing en Clojure pueden parecer un poco dolorosas, en realidad no está nada mal si usas unas macros bien diseñadas (gracias, Stuart, por un par de ellas) y coordina los cambios en la GUI con referencias. es decir, 'add-watch' es tu amigo. Clojure es bastante versátil y bastante agradable de usar. – Isaac

5

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 podría haberse 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.

3

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 están cerca de un superconjunto de Java. Sin embargo, no intentaría escribir un módulo de kernel de Linux en clojure ...

Por supuesto, es cierto 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 el 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 darles una idea de lo que creo que Clojure podría ser útil, actualmente estoy escribiendo mucho código relacionado con el póker 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 sigue siendo mucho más agradable (al menos para mí) en Clojure de lo que sería en, digamos, Java.

Ciertamente hay algunos otros casos en que alguien podría describir en qué parte de Clojure gana mucho debido a sus sofisticados mecanismos para administrar la concurrencia, etc. Me refiero a algo más modesto. Solo señalo que incluso si no necesita Esos mecanismos pueden encontrar a Clojure como un lenguaje muy agradable para la programación de propósito general, aunque uno requiere 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.

3

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 consiguiendo utilizar varias cosas que quiero aprender: la programación funcional, concurrencia, Java interoperabilidad (para Swing), etc.

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

Cuestiones relacionadas