2009-12-08 7 views
9

Puedo ver perfectamente por qué Clojure es realmente bueno para la programación simultánea. Puedo ver las ventajas de FP también a este respecto.¿Algún ejemplo en el que Clojure realmente brilla contra Java que no está relacionado con la simultaneidad/inmutabilidad?

Pero claramente, no todas las líneas de código que escribimos son parte de un hilo o necesitan acceso concurrente. Para esas partes del código (el fragmento de código más simple y secuencial), ¿qué es lo que Java realmente extrañó que proporcionó Clojure?

¿Se han perdido algunas características como Multimethods, Dynamic binding, Destructuring bind en Java?

que supone mi pregunta también se puede enmarcar como:

  • Si Clojure no tenía la concurrencia cuenta que tenía y el conjunto inmutabilidad/mutabilidad cuestión no era de nuestra preocupación, entonces lo otras características Clojure proporciona que lo haría usar en lugar de Java?
+0

En realidad, todo el código que se ejecuta en una JVM * es * parte de un hilo. –

Respuesta

25

¿Existían funciones como Multimethods, Dynamic binding, Destructuring bind realmente extrañadas en Java?

Sí. Además ...

  1. Funciones de primera clase. Deliciosas funciones de primera clase. Esto no es solo una cuestión de FP. Hay una buena razón por la que las personas claman por cierres en Java 7.

  2. Código-es-datos. Este es el beneficio de cualquier Lisp. El código Lisp no es solo bloques de texto que ingresas en la boca de un compilador y nunca vuelves a ver, son estructuras de listas y vectores y símbolos y literales que puedes manipular de forma programática. Esto lleva a poderosas macros, símbolos de primera clase y muchos otros objetos. Lleva a un lenguaje altamente extensible y poderoso.

  3. Clojure tiene mejores construcciones de control y bucle y la capacidad de crear sus propias a través de macros y funciones de primera clase. Java tiene for y foreach y while (y ni siquiera tiene foreach durante años).Clojure tiene map, filter, reduce, mapcat, un montón de do formas, mucha if y when formas, a través de las listas por comprensión for, y así sucesivamente. Si estos no existieran, podrías escribirlos tú mismo. En Java puede esperar una década para que un comité apruebe (tal vez) tales características.

  4. Menos los que se relacionan con el tipado estático, todas las características establecidas para Java 7, Clojure ya tiene o podría tener trivialmente. "Gestión automática de recursos", Clojure tiene el with-open. "Soporte de idiomas para colecciones", Clojure (y Ruby, Perl, Python ...) ya lo hizo. "Cuerdas en el interruptor", Clojure tiene construcciones similares a mayúsculas y minúsculas, como condp, y cualquier otra cosa que puedas imaginar. Puedes escribir cualquiera de estos en una docena de líneas de Clojure.

  5. Sintaxis concisa para listas, mapas, matrices, conjuntos, conjuntos ordenados, mapas ordenados etc. y uso casi intercambiable de todos ellos gracias a la abstracción seq. Soporte literal para expresiones regulares, caracteres, funciones anónimas, etc.

  6. Java tiene excepciones comprobadas obligatorias, que son molestas; Clojure no.

  7. La sintaxis de Java es detallada e irregular. La sintaxis de Clojure es concisa y regular. Incluso Java escrito en Clojure a menudo es más conciso que Java escrito en Java gracias a macros como -> y doto, y construcciones como proxy y (pronto) reify.

  8. El código de Java tiene demasiada repetición repetitiva e interminable. public static void main(String[] args){...} etc. Clojure no tiene nada que ver con esta repetición, mientras sacrifica poco o nada en términos de expresividad o poder. Incluso hoy en día, otros idiomas con tipado estático parecen estar yendo por el camino de la inferencia tipográfica. Hay una buena razón por la que necesita un IDE voluminoso centrado en Java para escribir y sin fin "refactorizar" el código Java; escribirlo a mano lo volvería loco y usaría los dedos hasta las protuberancias.

  9. En Java todo es una clase o interfaz, ya sea que deba ser o no, lo que es causa de complejidad innecesaria. Hay muchos programas que deben ser destrozados más allá del reconocimiento para adaptarse a un estilo OOP. Clojure te permite evitar esto. A nice rant to this effect. Clojure se centra principalmente en los verbos.

  10. La programación interactiva a través de REPL es divertida. Los ciclos de compilación/ejecución/depuración no lo son. Clojure aún compila archivos .class si lo desea; Mientras tanto, puedes sentarte en medio de tu código y jugar libremente mientras se ejecuta.

  11. Me gusta trabajar con los metadatos de Clojure y la sana prueba de igualdad. Al igual que su autopromoción de int a largo a Bigint, manejo nativo de números racionales, y así sucesivamente.

  12. La tipificación dinámica conduce a un código más corto, más genérico y, por lo tanto, más reutilizable y más potente que el tipado estático. (Este es un punto muy discutible, por supuesto, por lo que poner en último lugar.)

La popularidad de Scala y Groovy y JRuby y Jython y un sinfín de otras JVM-idiomas-que-HAYA Java debe estar se ve como una buena indicación de que, aunque la JVM es buena, Java-the-language es desagradable para muchas personas.

+2

Su punto n. ° 10 realmente no tiene nada que ver con Java o Clojure. Es el rasgo de la implementación, y realmente ni siquiera eso, es más un rasgo del entorno de desarrollo. Eclipse, que comenzó su vida como Smalltalk IDE, ha tenido un REPL de Java desde hace una década, está bien escondido. Mono tiene un C# REPL. Hay intérpretes C y C++ que tienen REPL. F #, Scala, Haskell tienen REPLs. 100% de acuerdo en sus otros 11 puntos, sin embargo. –

+0

Genial, nunca he visto un Java REPL. Si existen y se usan, eso es algo bueno. En Clojure/otros Lisps, el REPL es prácticamente el estándar, por lo que hay una excelente herramienta y soporte de la comunidad para eso. La programación interactiva es prácticamente la única forma de hacer la programación de Clojure. Parece que no se ha contagiado tanto en muchos otros idiomas. –

+0

Acabo de marcar, todavía está allí: http://help.eclipse.org/galileo/topic/org.eclipse.jdt.doc.user/concepts/cscrapbook.htm No es tan bueno como lo era cuando Eclipse todavía era VisualAge Smalltalk, sin embargo. –

2

Bueno, para uno generalmente hay mucha menos "ceremonia" en Clojure. Los lenguajes como Python y Ruby tienen esta ventaja sobre Java también (así la popularidad de JRuby, Jython).

Pero tenga en cuenta que hay momentos en que la verbosidad no se puede evitar en Java aunque puede haber un patrón claro. Las macros de Clojure son una gran ganancia aquí, incluso por encima de otros lenguajes igualmente dinámicos.

Otra cosa a considerar es que los programas Clojure tienden a ser seguros en concurrencia. Por lo tanto, si decide en el futuro hacer una aplicación particular concurrente, no será demasiado doloroso. Sin tomar muchas decisiones por adelantado, esto será considerablemente más difícil con Java.

También se pregunta si Clojure tendría una clara ventaja sobre Java si careciera de fuertes primitivas de simultaneidad e inmutabilidad, es como decir: "¿Y qué si Clojure no fuera Clojure?"

6

Brian lo ha resumido muy bien. Aquí hay algo que realmente me impresionó.(Del libro Programming Clojure por Stuart Halloway)

código Java, a partir de los Apache Commons:

public class StringUtils { 
    public static boolean isBlank(String str) { 
     int strLen; 
     if (str == null || (strLen = str.length()) == 0) { 
      return true; 
     } 
     for (int i = 0; i < strLen; i++) { 
      if ((Character.isWhitespace(str.charAt(i)) == false)) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

Aquí es una aplicación similar en Clojure:

(defn blank? [s] (every? #(Character/isWhitespace %) s)) 
Cuestiones relacionadas