Clojure ( / k l oʊ ʒ ər / , como cierre ) [15] [16] es una dinámica y funcional dialecto del lenguaje de programación Lisp en el Java plataforma. [17] [18] Como otros dialectos Lisp, Clojure trata el código como datos y tiene un sistema de macros Lisp . [19] El proceso de desarrollo actual está impulsado por la comunidad , [20] supervisado por Rich Hickey como sudictador benevolente de por vida (BDFL). [21]
Paradigma | multi-paradigma : |
---|---|
Familia | Ceceo |
Diseñada por | Rich Hickey |
Apareció por primera vez | 2007 |
Lanzamiento estable | 1.10.3 [8] / 4 de marzo de 2021 |
Disciplina de mecanografía | |
Plataforma | |
Licencia | Licencia pública de Eclipse |
Extensiones de nombre de archivo |
|
Sitio web | clojure |
Influenciado por | |
| |
Influenciado | |
| |
|
Clojure aboga por la inmutabilidad y las estructuras de datos inmutables y anima a los programadores a ser explícitos sobre la gestión de la identidad y sus estados. [22] Este enfoque en la programación con valores inmutables y construcciones explícitas de progresión del tiempo está destinado a facilitar el desarrollo de programas más robustos, especialmente concurrentes , que son simples y rápidos. [23] [24] [15] Si bien su sistema de tipos es completamente dinámico , los esfuerzos recientes también han buscado la implementación de la tipificación gradual . [25]
Cognitect proporciona soporte comercial para Clojure. [26] Las conferencias de Clojure se organizan todos los años en todo el mundo, siendo la más famosa Clojure / conj. [27]
Proceso de historia y desarrollo
Rich Hickey es el creador del lenguaje Clojure. [17] Antes de Clojure, desarrolló dotLisp, un proyecto similar basado en la plataforma .NET , [28] y tres intentos anteriores de proporcionar interoperabilidad entre Lisp y Java : una interfaz de lenguaje extranjero Java para Common Lisp (jfli), [29] Una interfaz de objetos extraños para Lisp (FOIL), [30] y una interfaz compatible con Lisp para Java Servlets (Lisplets). [31]
Hickey pasó aproximadamente 2 años y medio trabajando en Clojure antes de lanzarlo públicamente, gran parte de ese tiempo trabajando exclusivamente en Clojure sin financiación externa. Al final de este tiempo, Hickey envió un correo electrónico anunciando el idioma a algunos amigos de la comunidad Common Lisp.
El proceso de desarrollo está impulsado por la comunidad [20] y se gestiona en la página del proyecto Clojure JIRA . [32] La discusión general sobre el desarrollo ocurre en Clojure Google Group. [33] Cualquiera puede enviar problemas e ideas en ask.clojure.org, [34] pero para contribuir con parches, uno debe firmar el acuerdo de Colaborador de Clojure. [35] Los problemas de JIRA son procesados por un equipo de evaluadores y finalmente Rich Hickey aprueba los cambios. [36]
El nombre de Clojure, según Hickey, es un juego de palabras sobre el concepto de programación " cierre " que incorpora las letras C, L y J para C # , Lisp y Java respectivamente, tres lenguajes que tuvieron una gran influencia en el diseño de Clojure. [dieciséis]
Filosofía de diseño
Rich Hickey desarrolló Clojure porque quería un Lisp moderno para la programación funcional , simbiótico con la plataforma Java establecida y diseñado para la concurrencia . [23] [24] [37] [15]
El enfoque de Clojure al estado se caracteriza por el concepto de identidades, [22] que se representan como una serie de estados inmutables a lo largo del tiempo. Dado que los estados son valores inmutables, cualquier número de trabajadores puede operar en ellos en paralelo, y la concurrencia se convierte en una cuestión de gestionar los cambios de un estado a otro. Para este propósito, Clojure proporciona varios tipos de referencia mutables , cada uno con una semántica bien definida para la transición entre estados. [22]
Descripción general del idioma
Versión | Fecha de lanzamiento | Principales características / mejoras |
---|---|---|
16 de octubre de 2007 | [38]Lanzamiento público inicial | |
1.0 | 4 de mayo de 2009 | [39]Primera versión estable |
1.1 | 31 de diciembre de 2009 | [40]Futuros |
1.2 | 19 de agosto de 2010 | [41]Protocolos |
1.3 | 23 de septiembre de 2011 | [42]Soporte primitivo mejorado |
1.4 | 15 de abril de 2012 | [43]Literales de lector |
1,5 | 1 de Marzo, 2013 | [44]Reductores |
1.5.1 | 10 de marzo de 2013 | [45]Arreglar una fuga de memoria |
1,6 | 25 de marzo de 2014 | [46]API de Java, algoritmos hash mejorados |
1,7 | 30 de junio de 2015 | [47]Transductores, lectores condicionales |
1.8 | 19 de enero de 2016 | [48]Funciones de cadena adicionales, enlace directo, servidor de socket |
1,9 | 8 de diciembre de 2017 | [49]Integración con especificaciones, herramientas de línea de comandos |
1,10 | 17 de diciembre de 2018 | [50]Informes de errores mejorados, compatibilidad con Java |
1.10.1 | 6 de junio de 2019 | [51]Trabajar en torno a una regresión de rendimiento de Java y mejorar los informes de errores de clojure.main |
1.10.2 | 26 de enero de 2021 | [52]Mejoras de compatibilidad / interoperabilidad de Java y otras correcciones importantes del lenguaje |
1.10.3 | 4 de marzo de 2021 | [8]soporte prepl para condicionales del lector |
Ultima versión |
Clojure se ejecuta en la plataforma Java y, como resultado, se integra con Java y es totalmente compatible con la llamada de código Java desde Clojure, [53] [15] y el código Clojure también se puede llamar desde Java. [54] La comunidad utiliza Leiningen para la automatización de proyectos, proporcionando soporte para la integración de Maven . Leiningen maneja la gestión y las dependencias de los paquetes del proyecto y se configura utilizando la sintaxis de Clojure. [55]
Como la mayoría de los otros Lisps, la sintaxis de Clojure se basa en expresiones S que un lector analiza primero en estructuras de datos antes de compilarlas. [56] [15] El lector de Clojure admite sintaxis literal para mapas , conjuntos y vectores además de listas, y estos se compilan directamente en las estructuras mencionadas. [56] Clojure es un Lisp-1 y no pretende ser compatible con otros dialectos de Lisp, ya que utiliza su propio conjunto de estructuras de datos incompatibles con otros Lisps. [19]
Como dialecto Lisp, Clojure admite funciones como objetos de primera clase , un ciclo de lectura-evaluación-impresión (REPL) y un sistema de macros. [6] El sistema de macros Lisp de Clojure es muy similar al de Common Lisp con la excepción de que la versión de Clojure de la cita inversa (denominada "cita de sintaxis") califica los símbolos con su espacio de nombres . Esto ayuda a evitar la captura de nombres no intencionada, ya que está prohibido el enlace a nombres calificados por espacios de nombres. Es posible forzar una macroexpansión de captura, pero debe hacerse explícitamente. Clojure no permite macros de lector definidas por el usuario, pero el lector admite una forma más restringida de extensión sintáctica. [57] Clojure admite métodos múltiples [58] y para abstracciones similares a interfaces tiene un polimorfismo basado en protocolo [59] y un sistema de tipos de datos que utiliza registros , [60] que proporciona un polimorfismo dinámico y de alto rendimiento diseñado para evitar el problema de expresión .
Clojure tiene soporte para secuencias perezosas y fomenta el principio de inmutabilidad y estructuras de datos persistentes . Como lenguaje funcional , se hace hincapié en la recursividad y las funciones de orden superior en lugar del bucle basado en efectos secundarios. La optimización automática de llamadas de cola no es compatible ya que la JVM no la admite de forma nativa; [61] [62] [63] es posible hacerlo explícitamente utilizando la recur
palabra clave. [64] Para programación paralela y concurrente , Clojure proporciona memoria transaccional de software , [65] un sistema de agente reactivo , [1] y programación concurrente basada en canales . [66]
Clojure 1.7 introdujo los condicionales del lector al permitir la incrustación de código Clojure y ClojureScript en el mismo espacio de nombres. [47] [56] Se agregaron transductores como método para componer transformaciones. Los transductores permiten funciones de orden superior, como mapear y plegar, para generalizar sobre cualquier fuente de datos de entrada. Si bien tradicionalmente estas funciones operan en secuencias , los transductores les permiten trabajar en canales y permiten que el usuario defina sus propios modelos de transducción. [67] [68] [69]
Plataformas alternativas
La plataforma principal de Clojure es Java , [18] [53] pero existen otras implementaciones de destino. El más notable de ellos es ClojureScript, [70] que compila a ECMAScript 3, [71] y ClojureCLR, [72] un puerto completo en la plataforma .NET , interoperable con su ecosistema. Una encuesta de la comunidad Clojure con 1.060 encuestados realizada en 2013 [73] encontró que el 47% de los encuestados usaban tanto Clojure como ClojureScript cuando trabajaban con Clojure. En 2014, este número había aumentado al 55%, [74] en 2015, según 2.445 encuestados, al 66%. [75] Los proyectos populares de ClojureScript incluyen implementaciones de la biblioteca React como Reagent, [76] re-frame, [77] Rum, [78] y Om. [79] [80]
Otras implementaciones
Otras implementaciones de Clojure en diferentes plataformas incluyen:
- CljPerl, [81] Clojure encima de Perl
- Clojerl, [82] Clojure en BEAM , la máquina virtual de Erlang
- clojure-py, [83] Clojure en Python puro
- Ferret, [84] compila en C ++ 11 autónomo que puede ejecutarse en microcontroladores
- Joker, [85] un intérprete y linter escrito en Go
- Las3r, [86] un subconjunto de Clojure que se ejecuta en la máquina virtual ActionScript (la plataforma Adobe Flash Player)
- Pixie, [87] dialecto Lisp inspirado en Clojure escrito en RPython
- Rouge, [88] Clojure encima de YARV en Ruby
Popularidad
Con un interés continuo en la programación funcional, la adopción de Clojure por parte de los desarrolladores de software que utilizan la plataforma Java ha seguido aumentando. El lenguaje también ha sido recomendado por desarrolladores de software como Brian Goetz, [89] [90] [91] Eric Evans, [92] [93] James Gosling , [94] Paul Graham , [95] y Robert C. Martin . [96] [97] [98] [99] ThoughtWorks , mientras evaluaba lenguajes de programación funcionales para su Technology Radar, [100] describió Clojure como "una implementación simple y elegante de Lisp en la JVM" en 2010 y promovió su estado a " ADOPTAR "en 2012. [101]
En el "JVM Ecosystem Report 2018" (que se afirmó ser "la encuesta más grande de desarrolladores de Java"), que fue preparado en colaboración por Snyk y Java Magazine, clasificó a Clojure como el segundo lenguaje de programación más utilizado en la JVM para " aplicaciones principales ". [102] Clojure es utilizado en la industria por empresas [103] como Apple , [104] [105] Atlassian , [106] Funding Circle , [107] Netflix , [108] Puppet , [109] y Walmart [110] como así como agencias gubernamentales como la NASA . [111] También se ha utilizado para la informática creativa, incluidas las artes visuales, la música, los juegos y la poesía. [112]
Herramientas
Las herramientas para el desarrollo de Clojure han experimentado una mejora significativa a lo largo de los años. La siguiente es una lista de algunos IDE y editores de texto populares con complementos que agregan soporte para la programación en Clojure: [113]
- Átomo , con cloro [114]
- Emacs , con CIDER [115]
- IntelliJ IDEA , con Clojure-Kit [116] o Cursive [117] (una licencia gratuita está disponible para uso no comercial )
- Mesa ligera
- Vim , con chimenea.vim, [118] [119] vim-iced, [120] o Conjure (solo Neovim) [121] [122]
- Visual Studio Code , con Calva [123] o Clover [124]
Además de las herramientas proporcionadas por la comunidad, las herramientas oficiales de CLI de Clojure [125] también están disponibles en Linux , macOS y Windows desde Clojure 1.9. [126]
Características por ejemplo
Los siguientes ejemplos se pueden ejecutar en un REPL de Clojure como uno iniciado con las herramientas CLI de Clojure [125] o un REPL en línea como uno disponible en REPL.it. [127]
Sencillez
Debido al fuerte énfasis en la simplicidad, los programas típicos de Clojure consisten principalmente en funciones y estructuras de datos simples (es decir, listas, vectores, mapas y conjuntos):
;; Un punto de entrada típico de un programa Clojure: ;; Función `-main` ( defn -main ; nombre [ & args ] ; (variable) parámetros ( println " ¡Hola, mundo! " )) ; cuerpo
Programación en REPL
Al igual que otros Lisps , una de las características icónicas de Clojure es la programación interactiva en REPL . [128] Tenga en cuenta que, en los siguientes ejemplos, ;;
comienza un comentario de línea e ;; =>
indica el resultado esperado:
;; definir una var ( def a 42 ) ;; => # 'usuario / a;; llamar a una función llamada `+` ( + a 8 ) ;; => 50;; llamar a una función llamada 'even?' ( even? a ) ;; => verdadero;; definir una función que devuelva el resto de `n` cuando se divide por 10 ( defn foo [ n ] ( rem n 10 )) ;; => # 'usuario / foo;; llamar a la función ( foo a ) ;; => 2;; imprime la cadena de documentos de `rem` ( doc rem ) ;; => ------------------------- clojure.core / rem ([ num div ]) resto de dividir numerador por denominador.;; imprime la fuente de `rem` ( source rem ) ;; => ( defn rem "resto de dividir numerador por denominador." { : agregado "1.0" : estático verdadero : en línea ( fn [ x y ] ` ( . clojure.lang.Numbers ( resto ~ x ~ y )))} [ num div ] ( . clojure.lang.Numbers ( resto num div )))
Nombres en tiempo de ejecución
A diferencia de otros entornos de tiempo de ejecución donde los nombres se compilan, el entorno de tiempo de ejecución de Clojure es fácilmente introspectable utilizando estructuras de datos normales de Clojure:
;; definir una var ( def a 42 ) ;; => # 'usuario / a;; obtener un mapa de todas las vars públicas internadas en el espacio de nombres `user` ( usuario de ns-publics ) ;; => {a # 'usuario / a};; hacer referencia a la var a través de `# '` (macro del lector) y ;; su símbolo asociado, calificado por espacio de nombres, `usuario / a` # 'usuario / a ;; => # 'usuario / a;; eliminar la referencia (obtener el valor de) var ( deref # 'usuario / a ) ;; => 42;; definir una función (con una cadena de documentos) que ;; devuelve el resto de `n` cuando se divide por 10 ( defn foo " devuelve `(rem n 10)` " [ n ] ( rem n 10 )) ;; => # 'usuario / foo;; obtener los metadatos del var `# 'user / foo` ( meta # ' user / foo ) ;; => { : Arglists ([ n ]) , : DOC "vuelve` (REM n 10) `" , : línea 1 , : columna 1 , : de archivos "user.clj" , : nombre foo , : ns # de espacio de nombres [ usuario ]}
Codificar como datos (homoiconicidad)
Al igual que otros Lisps , Clojure es homoicónico (también conocido como código como datos ). En el siguiente ejemplo, podemos ver lo fácil que es escribir código que modifica el código en sí:
;; llamar a una función (código) ( + 1 1 ) ;; => 2;; citar la llamada a la función ;; (convirtiendo el código en datos, que es una lista de símbolos) ( comillas ( + 1 1 )) ;; => (+ 1 1);; obtener el primer elemento de la lista ;; (operando en código como datos) ( primero ( comillas ( + 1 1 ))) ;; => +;; obtener el último elemento de la lista ;; (operando en código como datos) ( último ( cita ( + 1 1 ))) ;; => 1;; obtenga una nueva lista reemplazando los símbolos en la lista original ;; (manipulando código como datos) ( map ( fn [ formulario ] ( forma de caso 1 'uno + ' más )) ( comillas ( + 1 1 ))) ;; => (más uno uno)
Operadores expresivos para la transformación de datos
Las macros de subprocesamiento ( ->
, ->>
y amigos) pueden expresar sintácticamente la abstracción de canalizar una colección de datos a través de una serie de transformaciones:
( - >> ( rango 10 ) ( mapa inc ) ( filtro par? )) ;; => (2 4 6 8 10)
Esto también se puede lograr de manera más eficiente utilizando transductores:
( secuencia ( comp ( mapa inc ) ( filtro par? )) ( rango 10 )) ;; => (2 4 6 8 10)
Gestión segura de subprocesos de identidad y estado
Un generador seguro para subprocesos de números de serie únicos (aunque, como muchos otros dialectos Lisp, Clojure tiene una gensym
función incorporada que usa internamente):
( def i ( átomo 0 ))( defn generate-unique-id "Devuelve un ID numérico distinto para cada llamada." [] ( swap! i inc ))
Macros
Una subclase anónima de java.io.Writer
eso no escribe en nada, y una macro que la usa para silenciar todas las impresiones dentro de ella:
( def bit-bucket-writer ( proxy [ java.io.Writer ] [] ( escribir [ buf ] nil ) ( cerrar [] nil ) ( flush [] nil )))( defmacro noprint "Evalúa los` formularios` dados con todas las impresiones en `* out *` silenciadas. " [ & forms ] ` ( vinculante [ * out * bit-bucket-writer ] ~ @ formularios ))( noprint ( println "¡Hola, nadie!" )) ;; => nada
Interoperabilidad de lenguajes con Java
Clojure se creó desde cero para adoptar sus plataformas de host como uno de sus objetivos de diseño y, por lo tanto, proporciona una excelente interoperabilidad de lenguajes con Java:
;; llamar a un método de instancia ( .toUpperCase "apple" ) ;; => "MANZANA";; llamar a un método estático ( System / getProperty "java.vm.version" ) ;; => "12 + 33";; crea una instancia de `java.util.HashMap` y ;; agregue algunas entradas ( doto ( java.util.HashMap. ) ( .put "apple" 1 ) ( .put "banana" 2 )) ;; => {"banana" 2, "manzana" 1};; crea una instancia de `java.util.ArrayList` y ;; incrementa sus elementos con `clojure.core / map` ( def al ( doto ( java.util.ArrayList. ) ( .add 1 ) ( .add 2 ) ( .add 3 )))( mapa inc al ) ;; => (2 3 4);; mostrar un diálogo de mensaje usando Java Swing ( javax.swing.JOptionPane / showMessageDialog nil "Hello, World!" ) ;; => nada
Memoria transaccional de software
10 subprocesos que manipulan una estructura de datos compartida, que consta de 100 vectores, cada uno de los cuales contiene 10 números únicos (inicialmente secuenciales). Luego, cada hilo selecciona repetidamente dos posiciones aleatorias en dos vectores aleatorios y las intercambia. Todos los cambios en los vectores ocurren en las transacciones haciendo uso del sistema de memoria transaccional de software de Clojure :
( defn ejecutar [ nvecs nitems nthreads niters ] ( deje [ vec-refs ( - >> ( * nvecs nitems ) ( rango ) ( en [] ( comp ( partición-todos los nitems ) ( mapa vec ) ( mapa ref )))) swap # ( let [ v1 ( rand-int nvecs ) v2 ( rand-int nvecs ) i1 ( rand-int nitems ) i2 ( rand-int nitems )] ( dosync ( let [ tmp ( nth @ ( vec-refs v1 ) i1 )] ( alter ( vec- refs v1 ) assoc i1 ( nth @ ( vec-refs v2 ) i2 )) ( alter ( vec- refs v2 ) assoc i2 tmp )))) Informe # ( - >> vec-árbitros ( en [] ( borrador ( mapa DEREF ) ( mapa ( fn [ v ] ( PRN v ) v )) gato ( distinta ))) ( recuento ) ( PRINTLN "distintas:" )) ] ( informe ) ( - >> # ( dotimes [ _ niters ] ( swap )) ( repetir nthreads ) ( aplicar pcalls ) ( dorun )) ( informe )))( ejecutar 100 10 10 100000 ) ;; => [ 0 1 2 3 4 5 6 7 8 9 ] [ 10 11 12 13 14 15 16 17 18 19 ] ... [ 990 991 992 993 994 995 996 997 998 999 ] Distinto : 1000[ 382 318 466 963 619 22 21 273 45 596 ] [ 808 639 804 471 394 904 952 75 289 778 ] ... [ 484 216 622 139 651 592 379 228 242 355 ] Distinct : 1000 nil
Ver también
- Lista de lenguajes JVM
- Lista de idiomas CLI
- Comparación de lenguajes de programación
Referencias
- ^ a b "Agentes y acciones asincrónicas" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Programación concurrente" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Hickey, Rich; contribuyentes. "core.async" . GitHub.com . Consultado el 7 de julio de 2019 .
- ^ "Programación funcional" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Nolen, David; Hickey, Rich; contribuyentes. "core.logic" . GitHub.com . Consultado el 7 de julio de 2019 .
- ^ a b "Macros" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Esterhazy, Paulus. "Guía de macros de subprocesos" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ a b Miller, Alex (4 de marzo de 2021). "Lanzamiento de Clojure 1.10.3" . Clojure.org .
- ^ Fogus, Michael (2011). "Preguntas y respuestas de Rich Hickey" . CodeQuarterly.com . Archivado desde el original el 11 de enero de 2017.
- ^ Hickey, Rich. "Estantería Clojure" . Amazon.com . Archivado desde el original el 3 de octubre de 2017 . Consultado el 7 de julio de 2019 .
- ^ Bonnaire-Sergeant, Ambrose (2012). Un sistema práctico de tipos opcionales para Clojure (tesis). Universidad de Australia Occidental.
- ^ "Programación Clojure" (PDF) . OReilly.com . Consultado el 30 de abril de 2013 .
- ^ Baldridge, Timothy. "Duendecillo" . PixieLang.org . Consultado el 7 de julio de 2019 .
- ^ Ramachandra, Ramkumar. "Rin" . GitHub.org . Consultado el 7 de julio de 2019 .
- ^ a b c d e Edwards, Kathryn (10 de agosto de 2009). "La AZ de los lenguajes de programación: Clojure" . Computerworld.com.au . Archivado desde el original el 26 de agosto de 2019.
- ^ a b Hickey, Rich (5 de enero de 2009). "significado y pronunciación de Clojure" . Google.com .
- ^ a b Krill, Paul (22 de marzo de 2012). "El inventor de Clojure, Hickey, ahora apunta a Android" . InfoWorld.com .
- ^ a b "Clojure" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ a b "Diferencias con otros Lisps" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ a b "Desarrollo" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Hickey, Rich (26 de noviembre de 2018). "El código abierto no se trata de ti" . GitHub.com .
- ^ a b c "Valores y cambio: enfoque de Clojure a la identidad y el estado" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ a b Hickey, Rich. "Justificación" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ a b Torre, Charles (6 de octubre de 2009). "De experto a experto: Rich Hickey y Brian Beckman - Inside Clojure" . MSDN.com .
- ^ "core.typed" . GitHub.com . Consultado el 7 de julio de 2019 .
- ^ "Invertir de una manera mejor" . Cognitect.com . Consultado el 7 de julio de 2019 .
- ^ "Clojure / conj" . Clojure-Conj.org . Consultado el 7 de julio de 2019 .
- ^ Hickey, Rich (16 de octubre de 2002). "[ANN] dotLisp - un dialecto Lisp para .Net" . Google.com .
- ^ Hickey, Rich (15 de abril de 2013). "jfli" . SourceForge.net .
- ^ Hickey, Rich (3 de abril de 2013). "lámina - Interfaz de objetos extraños para Lisp" . SourceForge.net .
- ^ Hickey, Rich (7 de marzo de 2013). "Lisplets" . SourceForge.net .
- ^ "Clojure" . Atlassian.net . Consultado el 7 de julio de 2019 .
- ^ "Clojure" . Google.com . Consultado el 7 de julio de 2019 .
- ^ "Foro de Clojure" . clojure.org . Consultado el 20 de marzo de 2020 .
- ^ "Acuerdo de colaborador" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Flujo de trabajo" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Elmendorf, Dirk (1 de abril de 2010). "Economy Size Geek - Entrevista con Rich Hickey, creador de Clojure" . LinuxJournal.com .
- ^ Hickey, Rich (16 de octubre de 2007). "¡Clojure es dos!" . BlogSpot.com .
- ^ Hickey, Rich (4 de mayo de 2009). "Clojure 1.0" . BlogSpot.com .
- ^ Hickey, Rich (31 de diciembre de 2009). "Lanzamiento de Clojure 1.1" . BlogSpot.com .
- ^ Hickey, Rich (19 de agosto de 2010). "Lanzamiento de Clojure 1.2" . Google.com .
- ^ Redinger, Christopher (23 de septiembre de 2011). "[ANN] Lanzamiento de Clojure 1.3" . Google.com .
- ^ Dipert, Alan (17 de abril de 2012). "[ANN] Lanzamiento de Clojure 1.4" . Google.com .
- ^ Halloway, Stuart (1 de marzo de 2013). "ANN: Clojure 1.5" . Google.com .
- ^ Halloway, Stuart (10 de marzo de 2013). "Clojure 1.5.1" . Google.com .
- ^ Miller, Alex (25 de marzo de 2014). "[ANN] Clojure 1.6" . Google.com .
- ^ a b Miller, Alex (30 de junio de 2015). "Clojure 1.7 ya está disponible" . Clojure.org .
- ^ Miller, Alex (19 de enero de 2016). "Clojure 1.8 ya está disponible" . Clojure.org .
- ^ Miller, Alex (8 de diciembre de 2017). "Clojure 1.9 ya está disponible" . Clojure.org .
- ^ Miller, Alex (17 de diciembre de 2018). "Lanzamiento de Clojure 1.10" . Clojure.org .
- ^ Miller, Alex (6 de junio de 2019). "Lanzamiento de Clojure 1.10.1" . Clojure.org .
- ^ Miller, Alex (26 de enero de 2021). "Lanzamiento de Clojure 1.10.2" . Clojure.org .
- ^ a b "Alojado en la JVM" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Interoperabilidad de Java" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Hagelberg, Phil; contribuyentes. "Leiningen" . Leiningen.org . Consultado el 7 de julio de 2019 .
- ^ a b c "El Lector" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Hickey, Rich. "edn" . GitHub.com . Consultado el 7 de julio de 2019 .
- ^ "Multimétodos y jerarquías" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Protocolos" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Tipos de datos: deftype, defrecord y reify" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Goetz, Brian (20 de noviembre de 2014). "Mayordomía: las partes aleccionadoras" . YouTube.com .
- ^ Rose, John (12 de julio de 2007). "llamadas de cola en la VM" . Oracle.com .
- ^ Rose, John (11 de febrero de 2009). "Algunos idiomas necesitan poder realizar llamadas de cola" . Java.net .
- ^ "Formularios especiales" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ "Refs y Transacciones" . Clojure.org . Consultado el 7 de julio de 2019 .
- ^ Hickey, Rich (28 de junio de 2013). "Canales Clojure core.async" . Clojure.org .
- ^ Hickey, Rich (17 de septiembre de 2014). "Transductores" . YouTube.com .
- ^ Hickey, Rich (6 de agosto de 2014). "Los transductores están llegando" . Cognitect.com .
- ^ Hickey, Rich (20 de noviembre de 2014). "Transductores internos" . YouTube.com .
- ^ "ClojureScript" . ClojureScript.org . Consultado el 6 de julio de 2019 .
- ^ "ClojureScript - FAQ (para desarrolladores de JavaScript)" . ClojureScript.org . Consultado el 4 de febrero de 2018 .
- ^ "ClojureCLR" . GitHub.com . Consultado el 28 de junio de 2012 .
- ^ Emerick, Chas (18 de noviembre de 2013). "Resultados de la encuesta 2013 State of Clojure & ClojureScript" . CEmerick.com .
- ^ "Estado de resultados de la encuesta de Clojure 2014" . WuFoo.com . Consultado el 17 de septiembre de 2015 .
- ^ Gehtland, Justin (28 de enero de 2016). "Estado de los resultados de la encuesta de Clojure 2015" . Cognitect.com .
- ^ "Reactivo" . GitHub.io . Consultado el 6 de julio de 2019 .
- ^ "volver a encuadrar" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Prokopov, Nikita. "Ron" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Nolen, David. "Om" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Coupland, Tom (17 de enero de 2014). "Om: mejorar la reacción de Facebook con inmutabilidad" . InfoQ.com .
- ^ Hu, Wei. "Un Lisp en Perl" . MetaCPAN.org . Consultado el 6 de julio de 2019 .
- ^ Facorro, Juan. "Clojerl" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Baldridge, Timothy. "clojure-py" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Akkaya, Nurullah. "Hurón" . Ferret-Lang.org . Consultado el 6 de julio de 2019 .
- ^ Bataev, Roman. "Joker" . Joker-Lang.org . Consultado el 6 de julio de 2019 .
- ^ Cañón, Aemon. "Laz3r" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Baldridge, Timothy. "Duendecillo" . PixieLang.org . Consultado el 6 de julio de 2019 .
- ^ Connor, Ashe. "Rouge" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Goetz, Brian (24 de mayo de 2020). "Lenguaje JVM que no es Java favorito de Brian Goetz (Parte 1 de 3)" . Twitch.tv .
- ^ Goetz, Brian (24 de mayo de 2020). "Lenguaje JVM que no es Java favorito de Brian Goetz (Parte 2 de 3)" . Twitch.tv .
- ^ Goetz, Brian (24 de mayo de 2020). "Lenguaje JVM que no es Java favorito de Brian Goetz (Parte 3 de 3)" . Twitch.tv .
- ^ Evans, Eric (14 de agosto de 2018). "Tiempo de modelado - Eric Evans - Diseño basado en dominios Europa 2018" . YouTube.com .
- ^ Evans, Eric (21 de noviembre de 2014). "Eric Evans en Twitter" . Twitter.com .
- ^ "Encuentro de James Gostling con la comunidad Java de Londres" . YouTube.com . 2016-10-11.
- ^ Graham, Paul (6 de mayo de 2016). "Paul Graham en Twitter" . Twitter.com .
- ^ Martin, Robert (22 de agosto de 2019). "¿Por qué Clojure?" . CleanCoder.com .
- ^ Martin, Robert (29 de noviembre de 2018). "Unble Bob Martin en Twitter" . Twitter.com .
- ^ Martin, Robert (1 de agosto de 2018). "Introducción a la programación funcional" . CleanCoders.com .
- ^ Martin, Robert (11 de julio de 2017). "Programación funcional pragmática" . CleanCoder.com .
- ^ "Preguntas frecuentes - Radar de tecnología - ThoughtWorks" . ThoughtWorks.com . Consultado el 10 de febrero de 2019 .
- ^ "Clojure - Technology Radar - ThoughtWorks" . ThoughtWorks.com . Consultado el 10 de febrero de 2019 .
- ^ Maple, Simon; Binstock, Andrew (17 de octubre de 2018). "Informe del ecosistema JVM 2018" . Snyk.io .
- ^ "Historias de éxito" . Clojure.org . Consultado el 27 de octubre de 2018 .
- ^ Liutikov, Roman (17 de diciembre de 2017). "Roman Liutikov en Twitter" . Twitter.com .
- ^ "Trabajos en Apple" . Apple.com . Consultado el 6 de julio de 2019 .
- ^ Borges, Leonardo (7 de julio de 2015). "Colaboración en tiempo real con Clojure" . YouTube.com .
- ^ Pither, Jon (4 de octubre de 2016). "Clojure en Londres: Círculo de financiación - Prestando algo de Clojure" . JUXT.pro .
- ^ Williams, Alex (3 de agosto de 2014). "Los nuevos creadores de pilas: Adrian Cockcroft en Sun, Netflix, Clojure, Go, Docker y más" . TheNewStack.io .
- ^ Price, Chris (11 de abril de 2014). "Una nueva era de servicios de aplicaciones en Puppet Labs" . Puppet.com . Consultado el 6 de agosto de 2020 .
- ^ Phillips, Marc (14 de julio de 2015). "Walmart ejecuta Clojure a escala" . Cognitect.com .
- ^ "Repositorio común de metadatos" . GitHub.com . Consultado el 6 de julio de 2019 .
- ^ Meier, Carin (6 de mayo de 2015). "Computación creativa con Clojure" . OReilly.com .
- ^ Miller, Alex (4 de febrero de 2019). " " Estado de Clojure 2019" Resultados" . Clojure.org .
- ^ Szabo, Maurício. "Cloro: Cliente Socket REPL para Clojure y ClojureScript" . Atom.io . Consultado el 5 de julio de 2019 .
- ^ Batsov, Bozhidar; contribuyentes. "CIDER: El entorno de desarrollo interactivo de Clojure que oscila" . CIDER.mx . Consultado el 5 de julio de 2019 .
- ^ Shrago, Greg. "Clojure-Kit: plugin Clojure y ClojureScript para herramientas basadas en IntelliJ" . JetBrains.com . Consultado el 5 de julio de 2019 .
- ^ Fleming, Colin. "Cursive: proporciona compatibilidad completa con los lenguajes Clojure y ClojureScript" . JetBrains.com . Consultado el 5 de julio de 2019 .
- ^ Papa, Tim. "Chimenea.vim: Soporte Clojure REPL" . VIM.org . Consultado el 5 de julio de 2019 .
- ^ Monroe, Dominic (13 de diciembre de 2016). "Clojure y Vim: una descripción general, es muy posible" . JUXT.pro .
- ^ Masashi, Iizuka. "vim-iced: Entorno de desarrollo interactivo Clojure para Vim8 / Neovim" . GitHub.com . Consultado el 13 de marzo de 2020 .
- ^ Caldwell, Oliver. "Herramientas de Neovim Clojure (Script) sobre prepl" . GitHub.com . Consultado el 9 de noviembre de 2019 .
- ^ Caldwell, Oliver (6 de noviembre de 2019). "Empezando con Clojure, Neovim y Conjure en minutos" . oli.me.uk .
- ^ Strömberg, Peter. "Calva: Programación interactiva Clojure & ClojureScript" . VisualStudio.com . Consultado el 5 de julio de 2019 .
- ^ Szabo, Maurício. "Trébol" . VisualStudio.com . Consultado el 28 de enero de 2021 .
- ^ a b Miller, Alex. "Guía de Deps y CLI" . Clojure.org . Consultado el 8 de julio de 2019 .
- ^ Miller, Alex (8 de diciembre de 2017). "Clojure 1.9" . Cognitect.com .
- ^ "Online Clojure REPL" . REPL.it . Consultado el 8 de julio de 2019 .
- ^ "Programación en el REPL: Introducción" . Clojure.org . Consultado el 4 de diciembre de 2018 .
Otras lecturas
- Sotnikov, Dmitri (2020), Desarrollo web con Clojure (3.a ed.), Pragmatic Bookshelf , ISBN 978-1-68050-682-2
- Olsen, Russ (2018), Getting Clojure , Estantería pragmática , ISBN 978-1-68050-300-5
- Miller, Alex; Halloway, Stuart; Bedra, Aaron (2018), Programming Clojure (3.a ed.), Pragmatic Bookshelf , ISBN 978-1-68050-246-6
- Rathore, Amit; Avila, Francis (2015), Clojure en acción (2a ed.), Manning , ISBN 978-1-61729-152-4
- Higginbotham, Daniel (2015), Clojure para los valientes y verdaderos , No Starch Press , ISBN 978-1-59327-591-4
- Gamble, Julian (2015), recetas de Clojure , Pearson Publishing , ISBN 978-0-32192-773-6
- Vandgrift, Ben; Miller, Alex (2015), Clojure Applied , Estantería pragmática , ISBN 978-1-68050-074-5
- Rochester, Eric (2015), Libro de cocina de análisis de datos de Clojure (2a ed.), Packt Publishing , ISBN 978-1-78439-029-7
- Fogus, Michael; Houser, Chris (2014), La alegría de Clojure (2a ed.), Manning , ISBN 978-1-617291-41-8
- Kelker, Ryan (2013), Clojure para lenguajes específicos de dominio , Packt Publishing , ISBN 978-1-78216-650-4
- Rochester, Eric (2014), Dominio del análisis de datos de Clojure , Packt Publishing , ISBN 978-1-78328-413-9
- Emerick, Chas; Carper, Brian; Grand, Christophe (19 de abril de 2012), Programación Clojure , O'Reilly Media , ISBN 978-1-4493-9470-7
- VanderHart, Luke; Sierra, Stuart (7 de junio de 2010), Practical Clojure , Apress , ISBN 978-1-4302-7231-1
enlaces externos
- Página web oficial