Sí. Además ...
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.
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.
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.
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.
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.
Java tiene excepciones comprobadas obligatorias, que son molestas; Clojure no.
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
.
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.
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.
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.
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.
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.
En realidad, todo el código que se ejecuta en una JVM * es * parte de un hilo. –