14. Namespaces
Todo caballero necesita un territorio, un lugar que le dé identidad. Don Quijote era de la Mancha, Amadís de Gaula. En Clojure, los namespaces son ese territorio: organizan tus funciones y variables bajo un nombre que las identifica y evita que colisionen con las de otro desarrollador. Equivalen a los paquetes de Java o los módulos de Python.
Declarar un namespace
Al principio de cada archivo se declara el namespace con ns. Los puntos separan niveles, como las comarcas dentro de un reino.
(ns mi-app.core)
Esto corresponde al archivo src/mi_app/core.clj. Los guiones en el namespace se convierten en guiones bajos en el nombre del archivo.
Cargar otros namespaces
Ningún caballero lucha solo. Usamos :require dentro de ns para invocar la ayuda de otros namespaces.
(ns mi-app.core
(:require
[clojure.string :as str]
[clojure.set :as set]))
Ahora podemos usar str/upper-case en lugar de clojure.string/upper-case.
Si prefieres usar la función sin prefijo, usa :refer.
(ns mi-app.core
(:require
[clojure.string :refer [upper-case trim]]))
(upper-case "hola")
;; "HOLA"
Mi consejo: usa :as siempre que puedas. Al leer el código queda claro de dónde viene cada función.
Importar clases Java
(ns mi-app.core
(:import
[java.util Date UUID]))
(Date.)
;; #inst "2026-04-01..."
Resumen
-
Cada archivo tiene un namespace declarado con
ns. -
Los puntos en el nombre corresponden a directorios, los guiones a guiones bajos.
-
:requirecon:ascarga namespaces con un alias. -
:referimporta funciones específicas sin prefijo. -
:importcarga clases Java.
Ejercicios
- Crea un namespace
aventura.caballeroque cargueclojure.stringcon el aliasstr. Escribe una función que convierta un nombre a mayúsculas.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Support me on Ko-fi