Introducción a Clojure

Clojure es un lenguaje de programación funcional, dinámico e inmutable que corre sobre la JVM, por lo que puede aprovechar todo el ecosistema de Java. Fue diseñado para facilitar la creación de software simple, concurrente y escalable, utilizando funciones, estructuras de datos inmutables y un entorno interactivo basado en REPL. Su sintaxis es muy diferente a Java porque utiliza expresiones con muchos paréntesis, y aunque tiene una comunidad más pequeña, es especialmente valorado en sistemas backend, procesamiento de datos y aplicaciones donde la concurrencia y la programación funcional son importantes.
Clojure fue creado por Rich Hickey y lanzado públicamente en 2007. Hickey diseñó el lenguaje con el objetivo de simplificar el desarrollo de software concurrente y aprovechar la robustez de la plataforma Java, combinando las ideas de los lenguajes Lisp con conceptos modernos de programación funcional e inmutabilidad. Actualmente, Rich Hickey es una figura muy influyente en la comunidad de arquitectura de software y programación funcional.
Cómo instalar Clojure y empezar con ejemplos prácticos
Si estás comenzando con Clojure, el mejor camino es instalar la CLI oficial, abrir un REPL y practicar con funciones pequeñas que te ayuden a entender el estilo de programación funcional de esta herramienta.
Este primer post reúne la instalación paso a paso y varios ejemplos que ya hemos trabajado en este proyecto para que puedas compartirlo con tu comunidad de forma clara y útil.
Github Repo: https://github.com/joedayz/clojure-senior-path
1) Instalación de Clojure
macOS con Homebrew
brew install clojure/tools/clojure
Linux (script oficial)
curl -O https://download.clojure.org/install/linux-install-1.11.1.1403.sh
chmod +x linux-install-1.11.1.1403.sh
sudo ./linux-install-1.11.1.1403.sh
Windows
Instala Java 21 o superior.
Instala la Clojure CLI con
winget:
winget install clojure
2) Verificación de la instalación
Ejecuta estas instrucciones para confirmar que todo quedó bien instalado:
java -version
clojure -Sdescribe
Si quieres ejecutar pruebas del proyecto:
clojure -M:test -m cognitect.test-runner
Si
cljfalla por un problema conrlwrap, usaclojuredirectamente. En muchos entornos,clojurees la opción más confiable.
3) Primer contacto con el REPL
El REPL es una de las mejores partes de Clojure. Te permite evaluar expresiones inmediatas y probar ideas en tiempo real.
(+ 2 3)
(* 5 6)
(str "Hola" " Clojure")
También puedes probar operaciones con colecciones:
(def numbers [12345])
(map #(* 2 %) numbers)
(reduce + 0 numbers)
(filter even? numbers)
4) Ejemplos básicos que ya hemos practicado
a) Duplicar cada número
(defn double-all
[numbers]
(map #(* 2 %) numbers))
Uso:
(double-all [1 2 3 4])
;; => (2 4 6 8)
b) Sumar todos los elementos
(defn sum-numbers
[numbers]
(reduce + 0 numbers))
Uso:
(sum-numbers [1 2 3 4])
;; => 10
c) Filtrar solo números pares
(defn even-only [numbers]
(filter even? numbers))
Uso:
(even-only [1 2 3 4 5 6])
;; => (2 4 6)
d) Contar vocales en un texto
(defn count-vowels
[text]
(let [lower (clojure.string/lower-case text)
vowels #{\a\e\i\o\u}]
(count (filter vowels lower))))
Uso:
(count-vowels "Hola Mundo")
;; => 4
e) Factorial con loop/recur
(defn factorial
[n]
(loop [current n acc 1]
(if (<=current 1)
acc
(recur (dec current) (* acc current)))))
Uso:
(factorial 5)
;; => 120
Este ejemplo es útil para entender cómo Clojure maneja la recursión sin caer en problemas de stack overflow cuando se usa loop/recur.
f) Promedio de una colección
(defn average
[numbers]
(if (empty? numbers)
0
(/ (reduce + 0 numbers)
(count numbers))))
Uso:
(average [10 20 30])
;; => 20
5) Trabajar con maps y datos estructurados
Clojure es muy cómodo para trabajar con mapas, y esto se vuelve muy útil cuando construimos datos de negocio o modelos simples.
Crear un usuario normalizado
(defn build-user
[{:keys [id name email]}]
{:id id
:name name
:email email
:active true})
Uso:
(build-user {:id 1 :name "Ana" :email "ana@example.com"})
;; => {:id 1, :name "Ana", :email "ana@example.com", :active true}
Resumen de producto
(defn product-summary
[{:keys [name price stock]}]
{:name name
:price price
:stock stock
:in-stock? (pos? stock)})
Uso:
(product-summary {:name "Laptop" :price 999 :stock 12})
;; => {:name "Laptop", :price 999, :stock 12, :in-stock? true}
6) Por qué Clojure valora este enfoque
Los ejemplos anteriores muestran algunas ideas clave de Clojure:
Las funciones son primero-class citizens.
Los datos son expresivos y fáciles de manipular.
Las colecciones se procesan con funciones como
map,filteryreduce.La recursión se maneja de forma clara con
loop/recur.Los maps permiten modelar información de una manera muy directa.
7) Siguiente paso recomendado
Para seguir avanzando, te recomiendo practicar en este orden:
Instalar la Clojure CLI.
Abrir el REPL y probar cada ejemplo manualmente.
Reescribir las funciones sin mirar el código.
Agregar nuevas pruebas con
clojure.test.Comenzar a crear pequeños ejercicios con maps y colecciones.
8) Cierre
Clojure puede verse desafiante al principio, pero cuando entiendes el flujo de datos y la sintaxis básica, se vuelve muy elegante y poderosa. El primer objetivo no es dominar todo desde el inicio, sino construir confianza con ejemplos pequeños y repetibles.
Si quieres, en el siguiente post podemos continuar con una introducción a:
let,if,condyfnlistas, vectores y mapas
reduce,mapyfilteren profundidadcómo estructurar un proyecto con namespaces y tests
Y así seguir compartiendo contenido útil para la comunidad de Clojure.
Enjoy!
Joe




