Lección 1: Introducción

Clojure

Bienvenido a uno de los pocos cursos de Clojure en español, realizado por el autor de Tadam Web Framework. Se ha creado a través de donaciones desinteresadas a manos de héroes que ayudan a que la formación sea un poco más libre y accesible para aquellos que no tienen tantos recursos. Gracias, en nombre mío y de todos ellos. En agradecimiento el contenido será siempre gratis y disponible de manera online desde cualquier dispositivo.

Paradigma

Los lenguajes de programación se podrían clasificar en 3 grandes paradigmas: los imperativos (C, COBOL…) que acentúa los cambios en las variables, los orientados a objetos (C++, Java, PHP, Python, Javascript..) evolución de los imperativos cuya fuerza radica en el empaquetamiento y los funcionales (Lisp, Haskell, Scala, Elm…) donde se usan expresiones con entradas y salidas. Ninguno es superior a otro, son diferentes puntos de vistas para resolver los mismos problemas. En este caso Clojure estaría dentro de los puramente funcionales, un lenguaje excepcional por disponer las mejores herramientas del paradigma con el rendimiento de Java al usar su máquina virtual (aunque existen otras implementaciones).

¿Cómo se pronuncia?

Antes de continuar profundizando debemos aclarar que Clojure se pronuncia como en inglés Closure (/ˈkloʊʒər/). Su nombre es un juego de palabras: “C” de C#, “L” de Lisp y “J” de Java. Los lenguajes que influenciaron a su creador, y actual vitalicio dictador benevolente, para el diseño. Una elegante forma de agradecer a todos los que trabajan detrás de esos lenguajes permitiendo que Clojure exista.

Origen

Rick Hickey desarrolló dotLips, un proyecto muy parecido a Clojure pero basado en el ecosistema de .NET. Después logro con éxito otros 3 proyectos donde conseguía herramientas de interoperabilidad entre Lisp y Java.

Con todo lo aprendido decidió empezar un proyecto nuevo, un lenguaje de programación que modernizara Lisp y trabajara muy estrechamente con la máquina virtual de Java. Sin ningún anuncio público, trabajó durante 2 años y medio en su primera versión de Clojure. Sin ayudas económica, y en algúnos periodos dedicando su tiempo completo.

Durante todo el proceso fue publicando en su blog los avances hasta que un día, el October 16 del 2007, envió emails a algunos amigos de la comunidad Common Lisp anunciando la versión estable. Su implementación gustó tanto que se empezó a utilizar como una versión contemporánea de Lisp, y parte de la comunidad fue incorporándose de forma gradual.

Implementaciones

Clojure no se compila, debe ser leído antes de ejecutarse (S-expressions o expresiones en árbol popularizado por Lisp). Por ello existen implementaciones en diferentes lenguajes de programación, similar a otros como puede ser Python, quién se encargan de preparar el código antes de lanzarlo. Entre ellas tenemos:

  • Clojure: Usando la máquina virtual de Java, la implementación principal. El 60% es Java mientras que el 40% es el propio Clojure.
  • Clujureclr: Nativamente implementado en Common Language Runtime (CLR), el motor de ejecución de Microsoft’s .Net Framework. Gran parte esta en C#.
  • Clojurescript: Compilador de Clojure para JavaScript. Genera código JavaScript compatible gracias al optimizador de Google Closure. Los frameworks más populares hacen uso de React (re-frame, Reagent…).

Existen muchas otras no oficiales, pero ninguna poseen el apoyo tan grande de la comunidad y el mantenimiento de las actualizaciones.

Empresas que lo utilizan

Diferentes firmas e instituciones gubernamentales lo usan principalmente para todo lo relacionado con desarrollo Web (APIs y microservicios), IA (siempre ha destacado Lisp en este área) y desarrollos de gran rendimiento. Nos podemos encontrar:

  • Apple.
  • Atlassian (empresa detrás de Trello, Bitbucket, Jira…).
  • Netflix.
  • Walmart.
  • Base2 (aviones Boeing).
  • NASA.

Aunque también es usado para la industria de la música, videojuegos, IA y…¡poesía!

Ventajas y desventajas

Pros

  • Toda la solidez de los lenguajes funcionales. Las variables son inmutables lo cual quita de cuajo gran parte de errores que te pueden encontrar en cualquier otro lenguaje.
  • Rendimiento Java, lo que sería similar a programar entre C++ y Go. (Fuente: The Benchmark Game)
  • Secuencias perezosas, posibilidad de trabajar con datos que no son calculados hasta que quieras averiguar su valor. Esto hace que su rendimiento se dispare.
  • Paralelismo. Realmente sencillo y totalmente nativo el uso de varios hilos de ejecución.
  • Fácil de empaquetar y desplegar, como en un jar.
  • Macros, crea tus propias estructuras del lenguaje si no existen.

Contras

  • Pocas similitudes con la programación orientada a objetos, necesitarás un esfuerzo de comprensión y persuadir a tus compañeros para integrarlo.
  • En tu equipo deberás instalar Java, C# o Javascript para ejecutarlo.
  • Como debe ser leído y estructurado al inicio de la ejecución se vuelve lento los primeros instantes.

Sintaxis

Vamos a empezar a familiarizarnos con la sintaxis. Todo el lenguaje se basa en funciones, lo cual significa que siempre vamos a utilizar funciones para todo, incluyendo declarar variables.

Funcion

El orden siempre será igual: nombre de la función + argumentos. Y siempre estará delimitado por paréntesis.

En el ejemplo se declara una variable y restamos su cantidad.

;; Defines una variable llamada `edad`
(def edad 42)

;; Usamos la función llamada `-` para restar
(- edad 8)

;; Devuelve => 34 ; Nos hemos quitado 8 años de un golpe

Los argumentos pueden ser variables u otras funciones, que a su vez tendrá su nombre y variables.

Funciones dentro de funciones

En el siguiente ejemplo buscamos obtener los números pares del 0 al 10. Para ello usaremos la función even? que nos dirá si el argumento es par, range el cual no da un rango de 10 números y filter que nos filtrará el contenido.

(filter #(even? %) (range 11))

;; Devuelve => (0 2 4 6 8 10)

Una línea elegante, sencilla y eficiente.

Material complementario

Trata todo el contenido de esta guía como una introducción a los elementos esenciales del lenguaje y la programación funcional, no es la biblioteca de Alejandría de Clojure. Existe mucho material en el exterior, tanto gratuito como de pago, que he utilizado y te ayudará a profundizar. Como siempre es complejo filtrar en internet, y además cada persona posee una forma diferente de aprender: libros, otros vídeos, otros guías cortas, actividades… Recomiendo empezar conociendo bien la sintaxis del lenguaje. En la página oficial hay una guía básica en Clojure estupenda.

Los libros más interesantes que he encontrado son:

Si quieres practicar te recomiendo actividades interactivas. Todas ellas son Katas cortas para ir mejorando día tras día.

Como apunte final quiero comentar que aunque no uses Clojure de forma recurrente te enseñará a ser mejor programador. Acabarás usando, sin darte cuenta, nuevas maneras de simplificar los problemas. Es una sensación que todos hemos vivido.

¿Te ayudo?

  • 1 café: ¡Gracias por el apoyo! Te ayudo a que esta web siga estando online pagando los servidores.
  • 2 cafés: Respondo a una duda en los comentarios.
  • 4 cafés: Te corrijo una actividad y te envío feedback.
Comprame un café

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario