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.

  • :require con :as carga namespaces con un alias.

  • :refer importa funciones específicas sin prefijo.

  • :import carga clases Java.

Ejercicios

  1. Crea un namespace aventura.caballero que cargue clojure.string con el alias str. Escribe una función que convierta un nombre a mayúsculas.

Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.

¿Me invitas a un café?

Visitantes en tiempo real

Estás solo: 🐱