- Introducción
- Sobre Clojure
- Entorno de trabajo
- Course Design Philosophy
- Créditos
- Copyright and License
Este taller busca familiarizarnos a razonar de manera funcional, usando el lenguaje de programación Clojure como herramienta de razonamiento.
Dos frases que nos sirven de contexto, una por parte de Alan J. Perlis:
Un lenguaje que no afecta tu forma de pensar en la programación, no merece ser aprendido.
De tal forma que la intención es exponernos a un lenguaje de programación y aprender algunas de sus características que pueden afectar nuestra manera de analizar y resolver problemas.
Y la otra frase por Uriel:
Para realmente comprender a Plan 9, tienes que des-aprender los últimos 30 años de Unix. Las similitudes son lo suficientemente grandes como para crear falsas expectativas.
Basta con hacer unos ajustes para obtener lo siguiente:
Para realmente comprender a la Programación Funcional, tienes que des-aprender los últimos 30 años de Programación Imperativa/Orientada a Objetos. Las similitudes son lo suficientemente grandes como para crear falsas expectativas.
- Familiarizarnos con el lenguaje de programación Clojure, tanto en su sintaxis y semántica.
- Familiarizarnos con "ideas avanzadas" en programación a partir de elementos primitivos
en Clojure.
- Ideas tales como: inmutabilidad, estructuras de datos inmutables, recursividad, evaluación perezosa, aridad de funciones, closure, funciones de orden superior y composición.
- Familiarizarnos con un lenguaje funcional.
- Despejando el misterio o las creencias que hay sobre "programar sin variables", "programar sin ciclos for, while, do-while" o "programar sin efectos secundarios".
- Explicar la teoría de programación funcional como si fuera una lista de conceptos sin uso práctico en la programación cotidiana.
- Explicar las entrañas de Clojure o el como están implementadas las "ideas avanzadas".
- Abordar las herramientas propias de Clojure para pruebas unitarias, análisis estático de código, formateo de código, despliegue de una aplicación, etc.
- Confrontar las preferencias personales para programar: lenguajes, paradigmas, editores de texto, sintaxis, tipado, etc.
- des-aprender para aprender
- Algunas ideas en la programación funcional son contrarias a las ideas promovidas en la programación imperativa/orientada a objetos (PI/OO). En el caso de Clojure podemos leer Object Orientation is overrated
- Nos será de gran ayuda dejar a un lado las "buenas prácticas de programación" promovidas por la PI/OO.
- esencia contra implementación
- Es normal cuestionarse el como funcionan las cosas, sin embargo es más importante concentrarse en la esencia de las cosas para su uso o aprovechamiento.
- intuición contra formalidad
- Conocer conceptos primitivos o esenciales en cierto orden y con cierto grado de rigidez nos ayuda a comprender conceptos complejos paulatinamente.
- lo importante contra lo urgente
- Es posible que busquemos un beneficio inmediato en aquello que usamos, debido a una necesidad o una presión que no controlamos del todo. Ante esto, es posible que no prestemos la debida atención a lo importante de lo que usamos, a aquellos que podría beneficiarnos en otras situaciones en un posible futuro.
Clojure es un lenguaje de programación funcional encontrado en distintas plataformas o entornos de ejecución, así como un lenguaje de programación que ha influenciado a otros:
- Oficial: Java Virtual Machine
- GraalVM Native Image
- ClojureScript: Javascript / NodeJS
- ClojureCLR: C# / .NET CLR
- Babashka: shell script
- jank: LLVM / C++
- phel: PHP
- Carp: Haskell
- Ferret: C++11
- hy: Python
- clojerl: Erlang VM
- Fennel: Lua
- Joker: Go
- ClojureRS: Rust
Cuenta con varias historias de éxito, siendo usado por compañías de distinto tamaño alrededor del mundo, incluyendo a empresas como Apple, CircleCI, Heroku, Nubank y Walmart. Vale la pena mencionar la existencia de comunidades de usuarios en distintos países.
El entorno de desarrollo está basado en el uso de Java, Leiningen y VSCode.
Se utilizará la JVM (Java Virtual Machine) como anfitrión de Clojure, para lo cual se hace uso de la versión 17 del Java Development Kit (JDK), ofrecido por el proyecto Eclipse Adoptium Temurin:
$ which java
/usr/bin/java
$ java -version
openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment Temurin-17.0.5+8 (build 17.0.5+8)
OpenJDK 64-Bit Server VM Temurin-17.0.5+8 (build 17.0.5+8, mixed mode, sharing)
$ which javac
/usr/bin/javac
$ javac -version
javac 17.0.5
Notas:
-
Es posible hacer uso de la versión 11 del JDK.
-
El proyecto SDKMAN! permite la instalación del JDK en los sistemas operativos principales (MS Windows, GNU/Linux y macOS):
$ sdk install java 17.0.5-tem
Leiningen ayuda a la administración de proyectos en Clojure, permitiendo su creación, el manejo de sus dependencias, su ejecutarlo, su empaquetado, así como ejecutar un REPL como parte del mismo.
$ which lein
/usr/bin/lein
$ lein version
Leiningen 2.9.7 on Java 17.0.5 OpenJDK 64-Bit Server VM
Notas:
-
Podemos seguir las indicaciones dadas para su instalación o bien instalarlo mediante SDKMAN!:
$ sdk install leiningen
Visual Studio Code es un editor de texto gratuito, el cual se puede descargar desde https://code.visualstudio.com/download.
Calva es un plugin que otorga un entorno de desarrollo a Visual Studio Code para programar en Clojure y ClojureScript.
La documentación de Calva se encuentra en https://calva.readthedocs.io.
Las siguientes instrucciones nos permitirán por un lado verificar que nuestro entorno de trabajo se encuentre correctamente configurado, una vez instalado los anteriores programas, y por otro lado nos permitirá tener un primer contacto con Clojure.
Para acceder a un REPL ejecuta el comando lein repl
en un terminal o consola de tu sistema
operativo:
$ lein repl
nREPL server started on port 53812 on host 127.0.0.1 - nrepl://127.0.0.1:53812
REPL-y 0.5.1, nREPL 0.8.3
Clojure 1.10.3
OpenJDK 64-Bit Server VM 17.0.5+8
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
user=>
Para salir del REPL evalua la expresión (exit)
en el prompt (user=>
) del REPL:
user=> (exit)
Bye for now!
Te será necesario crear un proyecto de Clojure mediante Leiningen y cargar dicho proyecto en VSCode para acceder a un REPL.
Para crear un proyecto en Clojure ejecuta el comando lein new <nombre del proyecto>
, por ejemplo:
$ lein new proyecto-de-clojure
Generating a project called proyecto-de-clojure based on the 'default' template.
The default template is intended for library projects, not applications.
To see other templates (app, plugin, etc), try `lein help new`.
En VSCode abre la carpeta proyecto-de-clojure
recientemente creada.
Una vez cargado el proyecto de Clojure en VSCode da click sobre el botón REPL (ubicado en la barra inferior de VSCode), selecciona la opción Start your proyect with a REPL and connect (a.k.a jack-in) y posteriormente la opción Leiningen.
Como resultado podrás hacer uso del REPL mediante la pestaña output.calva-repl, evaluando
expresiones en el prompt (clj:proyecto-de-clojure.core:>
) del REPL.
En el siguiente video podrás encontrar las mismas instrucciones expuestas en los anteriores puntos para configurar a VSCode y Calva, así como los pasos para ejecutar un REPL en VSCode.
Copyright (c) 2022 Antonio Hernández Blas
Distributed under the MIT license