¿Qué tiene de bueno Clojure? [cerrado]

40

He estado echando un vistazo a Clojure últimamente y me encontré con esta publicación en Stackoverflow que indica algunos proyectos que siguen las mejores prácticas y, en general, un buen código de Clojure. Quería entender el idioma después de leer algunos tutoriales básicos, así que eché un vistazo a algunos proyectos del "mundo real".

Después de mirar ClojureScript y Compojure (dos de los proyectos "buenos" mencionados anteriormente), siento que Clojure es una broma. No entiendo por qué alguien elegiría Clojure en lugar de, por ejemplo, Ruby o Python, dos idiomas que amo y tienen una sintaxis tan limpia y son muy fáciles de aprender, mientras que Clojure usa tantos paréntesis y símbolos en todas partes que arruina la legibilidad para yo.

Creo que Ruby y Python son hermosos, legibles y elegantes. Son fáciles de leer incluso para alguien que no conoce el idioma al revés. Sin embargo, Clojure es opaco para mí y siento que debo conocer cada pequeño detalle sobre la implementación del lenguaje para poder entender cualquier código.

¡Así que por favor, ilumíneme!

  • ¿Qué tiene de bueno Clojure?
  • ¿Cuál es el mínimo absoluto que debo saber sobre el idioma para poder apreciarlo?
marco-fiset
fuente
14
I don't understand why someone would pick Clojure over say, Ruby or Python- se ejecuta en jvm y puede usar toda la biblioteca de java. ... have such a clean syntaxpodría decirse que los lenguajes funcionales lisp tienen una sintaxis y estructura muy limpias, es solo una a la que la mayoría de la gente no está acostumbrada.
22
Su nombre es sexy.
programador
44
Cualquier adolescente que viva en un sótano puede recoger a Python y Ruby en cuestión de pocos meses. Si eso es todo lo que quieren usar, nunca saldrán del sótano. No digo que alguien que haya desarrollado Python profesionalmente durante muchos años sea menos mortal en comparación con alguien que escribe C incrustado, pero si Python y Ruby son todo lo que saben y todo lo que quieren saber, entonces algo es sospechoso. Por cierto, me llevó personalmente más de 6 años después de graduarme para descubrir y apreciar la programación funcional y Lisps. Mi primera reacción a Scheme fue un reflejo.
Trabajo
44
"podría decirse que los lenguajes funcionales lisp tienen una sintaxis y una estructura muy limpias, es solo una a la que la mayoría de la gente no está acostumbrada": tengo muy poca experiencia con Lisp y acabo de empezar a leer el libro "Practical Common Lisp". Hasta ahora, no he encontrado ningún problema con la sintaxis; En mi humilde opinión, los mitos sobre la sintaxis similar a Lisp son menos legibles son solo FUD.
Giorgio
44
Empecé a mirar Clojure recientemente (pero tengo experiencia previa con Haskell y Scala, por lo que la sintaxis no es tan impactante). De hecho, me pareció sorprendentemente legible. Hay muchos fewsímbolos fuera del paréntesis en comparación con muchos idiomas, y casi no hay palabras reservadas. La razón por la que lo encuentra ilegible es porque es un paradigma totalmente nuevo y funciona de una manera fundamentalmente diferente a un lenguaje orientado a objetos típico. Dale algo de tiempo y poder.
KChaloux

Respuestas:

47

Para el fondo que diste, si puedo parafrasear:

  1. Estás familiarizado con Ruby / Python.
  2. Aún no ve las ventajas de Clojure.
  3. No encuentra clara la sintaxis de Lisp o Clojure.

... Creo que la mejor respuesta es leer el libro Clojure Programming de Emerick, Carper y Grand. El libro tiene numerosas comparaciones de código explícito con Python, Ruby y Java, y tiene explicaciones de texto que abordan los codificadores de esos lenguajes. Personalmente, llegué a Clojure después de construir proyectos de buen tamaño con Python y tener algo de experiencia en Lisp; leer ese libro me ayudó a convencerme de comenzar a usar Clojure no solo en proyectos paralelos sino también para fines profesionales.

Para abordar sus dos preguntas directamente:

  1. ¿Qué tiene de bueno Clojure? Muchas respuestas en este sitio y en otros lugares, por ejemplo, consulte https://www.quora.com/Why-would-someone-learn-Clojure
  2. ¿Cuál es el mínimo absoluto que debo saber sobre el idioma para poder apreciarlo? Sugeriría conocer las grandes ideas detrás del diseño de Clojure, tal como se articulan tanto en la programación de Clojure como en The Joy of Clojure , y en las charlas de Rich Hickey, esp. la charla Simple Made Easy . Una vez que sepa qué / por qué , puede comenzar a comprender el cómo al leer el código Clojure, especialmente. cómo cambiar su pensamiento de clases, objetos, estado / mutación a "solo funciones y datos" (funciones de orden superior, mapas / conjuntos / secuencias, tipos).

Sugerencias adicionales: la elegancia y el poder de Lisp se deben en parte a su sintaxis minimalista y totalmente consistente. Es mucho más fácil apreciar eso con un buen editor, por ejemplo, Emacs con clojure-mode y ParEdit. A medida que se familiarice con él, la sintaxis se desvanece y "verá" la semántica, las intenciones y las abstracciones concisas. En segundo lugar, no comience leyendo la fuente de ClojureScript o Compojure, ya que son demasiados a la vez; pruebe algunos problemas de 4clojure.org y compare las soluciones con los principales codificadores allí. Si ve de 4 a 6 otras soluciones, invariablemente alguien habrá escrito una solución de estilo FP realmente idiomática y sucinta que puede comparar con una solución de estilo imperativo torpe, verbosa e innecesariamente complicada.

limist
fuente
20

Los dialectos de Lisp tienen un nicho único debido a su sintaxis simple. Esta sintaxis simple hace que la meta programación a través del uso de macros sea muy simple. Esto le permite modelar el idioma para que se adapte a su dominio problemático en lugar de modelar para adaptar su dominio problemático a su idioma. Es realmente genial una vez que lo entiendes, y te permite hacer muchas cosas fácilmente que es muy difícil en otros idiomas.

La desventaja es que, dado que cada programa Lisp define esencialmente su propio lenguaje, realmente necesita una comprensión sólida de las cosas para comprender lo que está sucediendo.

Ahora, para responder a sus preguntas ...

  1. Clojure es un dialecto moderno de Lisp que se ejecuta en JVM / CLR. Esto facilita aprovechar el poder de Lisp en una infraestructura existente.

  2. Es esencial comprender cómo usar macros para construir Lisp en su dominio problemático para apreciar su uso. Realmente solo entendí esto después de implementar un tiempo de ejecución de Lisp, cuando descubrí que muchas de las características principales del lenguaje se pueden implementar fácilmente en Lisp. Se necesita un proyecto de buen tamaño para obtener esto.

Aparte de sus ventajas, aunque es divertido programarlo, personalmente no tengo muchos casos en los que recurriría a él para problemas diarios. Es una muy buena herramienta para aprender a expandir la mente, y después de aprender Lisp correctamente, se volvió mucho más natural aprovechar las facilidades de meta programación en otros idiomas.

La sintaxis simple facilita la interpretación de las computadoras (permitiendo macros tan potentes y fáciles), pero hace muy difícil que un humano analice rápidamente expresiones complejas.

bunglestink
fuente
2
¿Has mirado a la mesa de luz ?
44
Su respuesta hace que parezca que las macros son la forma normal de abordar la programación de Lisp, cuando de hecho la mayoría de los problemas de programación se pueden resolver con funciones ordinarias de primera clase. Las macros están destinadas principalmente a ser utilizadas para la programación de idiomas (es decir, extender el idioma). Ver también bookshelf.jp/texi/onlisp/onlisp_9.html
Robert Harvey
3
@RobertHarvey Diría que si no está aprovechando los marcos, hay una gran cantidad de otros idiomas a los que recurriría que ofrecen funciones de primera clase con una sintaxis mucho más legible.
bunglestink
@MichaelT que se ve bien. Me gusta el concepto
DPM
3
@RobertHarvey Scala, JavaScript, C #, Python y Haskell están en la cima de mi cabeza en cuanto a idiomas con funciones de primera clase que consideraría una sintaxis más analizable por humanos que Lisps.
bunglestink
10

Las fortalezas de Clojure se han resaltado muchas veces y, por supuesto, crean un lenguaje muy poderoso, por lo que no las volveré a repetir aquí.

Siempre me encantó el lisp, desde los días de la universidad y estaba realmente emocionado cuando descubrí Clojure (¡quizás la posibilidad de usar lisp fuera de la academia por fin!). Sin embargo, cuando comencé a aprender, una sensación incómoda comenzó a aparecer, aunque no puedo precisar exactamente qué es lo que no me gusta. En primer lugar, diría que codificar en Common lisp fue fácil y divertido para mí, pero Clojure tiene una curva de aprendizaje más pronunciada. Clisp tenía cierta belleza y elegancia. No estoy seguro de tener la misma sensación de Clojure. Me pregunto si ese sentimiento desaparecerá a medida que tenga más experiencia.

Tengo otra suposición para mi misteriosa ligera repulsión. Creo que podría ser su gran flexibilidad. Por ejemplo, puede tener estructuras que son mitad vector y mitad mapa y con algunos caracteres de código puede aceptarlas como parámetros, separarlas y procesarlas correctamente. Sí, elimina todo el repetitivo, pero de alguna manera no se siente bien. Es como si nunca supieras muy bien las reglas bajo todos los paréntesis, dos puntos, corchetes, etc. están funcionando.

Para mí, todavía me encanta el lenguaje por todas sus ventajas (principalmente, ejecutar en la JVM y simplificar la concurrencia, a la vez que es mucho más poderoso y conciso que Java y con defectos de diseño menos obvios), pero aún no se sabe si algo podría haber sido mejorado

DPM
fuente