4. REPL
La herramienta más poderosa que vas a encontrar para desarrollar con Clojure es un software llamado REPL (Read-Eval-Print Loop). Nos abrirá la posibilidad de interactuar directamente con el lenguaje, evaluando fragmentos de código o expresiones. Nada que no puedas encontrar en otros sitios como PHP, Python, Node… salvo por un detalle: podemos interactuar con programas mientras se ejecutan ¡en tiempo real! Olvídate de buscar el log con la esperanza de entender su diabólico galimatías. Ahora puedes entrar directamente en el programa y ¡observar sus variables o utilizar sus funciones! Incluso escribir código y enviarlo para observar su comportamiento.
Deja de contener la respiración y prueba por ti mismo.
Primeros pasos
Para lanzar el REPL oficial de Deps and CLI, ejecuta en el terminal.
clj
Mostrará la versión de la instalación y una línea para introducir código. Te está tentando para crear software.
Clojure 1.10.2
user=>
Vamos a escribir el clásico print. Evitaremos el texto Hola Mundo ya que pertenece al mundo de los Objetos, nosotros jugamos en otra liga. Nosotros saludaremos al infinito.
Escribe en el REPL.
(println "Hola Infinito")
¡Espera! Estás a solo un Enter de ejecutar tu primer código funcional. Piénsatelo muy bien, no habrá vuelta atrás. Tus conexiones cerebrales serán arrancadas desde los cimientos para reconstruir un nuevo programador.
Último aviso. Estás a tiempo de cerrar el libro (no se admiten devoluciones).
¿Sigues aquí? Entonces adelante, es hora de entrar a un mundo donde la sencillez se vuelve la regla general y el infinito es tan solo otra variable que bailará entre tus dedos.
Es el momento, pulsa Enter.
Hola Infinito
nil
user=>
Nos ha devuelto 2 elementos:
-
El texto Hola Infinito, que se ha impreso con
println. Una función que imprime por consola unstring. -
Toda función devuelve algún contenido. De no ser así nos responderá con
nil. Tipo equivalente a otros lenguajes comonullo nulo.
Vamos a hacer algo más interesante, ¿qué tal si sumamos entre sí todos los números del 0 al 9?
Escribe.
(println (reduce + (take 10 (range))))
-
rangecrea una lista de los números del 0 al… infinito (como lo oyes). A Clojure se le da de maravilla trabajar con secuencias sin límite alguno. -
take, de infinitos números te quedas con los10primeros elementos. Y como se empieza contando por 0, nos devuelve la secuencia del 0 al 9. -
reducees una función que realiza una operación con cada elemento de la secuencia y lo almacena, para cuando termina devolverlo. En este caso ejecuta el operador+con cada número. -
printlnimprime el resultado en una nueva línea.
Al pulsar Enter nos devolverá la suma de 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9.
45
nil
Elegante y bonito, como debe ser todo código.
¿Y si usamos todo su rendimiento bruto para sumar un poco más, como hasta… 10.000.000?
(println (reduce + (take 10000000 (range))))
49999995000000
nil
Es una operación realmente estresante. Si tienes una CPU promedio, habrás esperado un par de segundos. No está nada mal, ¿no crees?
Servidor remoto
Una de las grandes ventajas de Clojure es poder levantar un servidor REPL de sockets que escuche todo lo que hagamos. De ese modo podemos sincronizar el estado de la aplicación entre el editor, el terminal o los fragmentos que lancemos. Esta alineación de variables y funciones nos da libertad de lanzar la aplicación para tranquilamente visualizar en caliente las variables o modificar sus valores para comprobar sus resultados.
Lo primero que debemos hacer es definir una configuración. Más adelante profundizaremos al respecto.
Crear un archivo llamado deps.edn. En su interior añade el siguiente contenido.
{:aliases
{:repl-server
{:exec-fn clojure.core.server/start-server
:exec-args {:name "repl-server"
:port 5555
:accept clojure.core.server/repl
:server-daemon false}}}}
A continuación ejecutamos.
clojure -X:repl-server
No visualizarás ningún mensaje, tan solo el cursor descenderá una línea quedando a la espera.
Cliente
Para conectarnos abriremos un segundo terminal y ejecutamos netcat, una simple herramienta Unix para leer o escribir a través de redes usando los protocolos TCP o UDP.
nc localhost 5555
Ya puedes lanzar cualquier código de Clojure. Para salir pulsa Ctrl+C. Pero ¡no lo cierres aún! Vamos a realizar un ejemplo para asimilar el potencial de usar un REPL remoto. Crea una variable.
(def caballero "Don Quijote")
Nos devolverá el espacio de trabajo donde está asignada la variable. Ya lo trataremos más adelante, de momento ignora el mensaje.
#'user/caballero
Ahora imprimiremos la variable para cerciorarnos de su contenido.
(println caballero)
Don Quijote
nil
Todo en orden. Ahora vamos a crear un tercer terminal. Recordemos que el primero es el servidor y el segundo es el cliente que acabamos de utilizar para crear la variable.
En este nuevo terminal, conectamos de nuevo.
nc localhost 5555
Imprimimos la variable como antes.
(println caballero)
Don Quijote
nil
¡Nos devuelve lo mismo! Hemos accedido en caliente a una variable.
Continuamos en el segundo terminal. Vamos a modificarla.
(def caballero "Alonso Quijano")
Volvemos al tercer terminal.
(println caballero)
Alonso Quijano
nil
Hemos alterado el estado de las variables en un software que se está ejecutando. Pura magia.
A pesar de que estemos trabajando en local, puedes replicar las mismas acciones si tu software está funcionando en un servidor remoto con SSH, SFTP o, incluso, con HTTP [^5].
Resumen
-
REPL permite ejecutar código Clojure.
-
REPL puede ser utilizado para conectar a un software en ejecución y realizar debugging.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Support me on Ko-fi