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