Unas semanas atrás retome después de muchos años el estudio de Clojure. Tiempos atrás un amigo me presento este lenguaje con un paradigma muy diferente a lo que yo conocía programando en C++, PHP y Python. En ese momento para mi fue complejo y frustrante entenderlo, en especial por la poca documentación a la que tuve alcance. Hoy gracias a la mayor información disponible me volví a dar a la tarea de acercarme a este paradigma de Programación Funcional. Recuerdo que cuando estaba en la escuela alguien me dijo una vez…
Dicen que cuando estas aprendiendo algo nuevo lo mejor para fijar los conceptos es tratar de explicarle a otro. Y la mejor forma de enseñarle a otro es cuando aun recuerdas lo difícil que fue cuando no sabias nada.
Dicen que cuando estas aprendiendo algo nuevo lo mejor para fijar los conceptos es tratar de explicarle a otro. Y la mejor forma de enseñarle a otro es cuando aun recuerdas lo difícil que fue cuando no sabias nada.
Que es clojure?
Clojure es un lenguaje de programación funcional, un dialecto LISP, que se ejecuta en la máquina virtual Java (JVM) y puede compilarse en JavaScript (ClojureScript). También tiene puertos comunitarios populares para Erlang, https://github.com/clojerl/clojerl y un intérprete eficiente para el shell de Unix. Al ejecutarse en JVM, Clojure hace que llamar a las bibliotecas de Java sea muy fácil, lo que le da más alcance que otros lenguajes de programación funcionales. Puede ser pragmático y usar fácilmente soluciones y frameworks establecidos en el ecosistema de Java cuando lo necesite. Destaca por estar construido sobre estructuras de datos inmutables innovadoras y ser bastante eficiente.
La programación funcional es un paradigma de programación declarativa basado en el uso de funciones matemáticas, en contraste con la programación imperativa, que enfatiza los cambios de estado a través de la mutación de variables. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en la década de 1930 para investigar los fundamentos de la computación. Se basa en la definición de funciones y su aplicación, incluida la recursividad. Tiene un núcleo muy pequeño sin primitivas numéricas, pero ha demostrado ser Turing completo. La mayoría de los lenguajes de programación funcionales son elaboraciones del cálculo lambda con o sin tipo.
Programación funcional
Si te interesa escribir programas con código más robusto, menos susceptible a errores y expandir tu pensamiento; la programación funcional tiene mucho que brindarte. Por ejemplo, la inmutabilidad minimiza la posibilidad de encontrar defectos accidentales originados por la manipulación del estado del programa en lugares desconocidos. La inmutabilidad reduce la complejidad y permite razonar localmente.
Otras gran razón para aprender la programación funcional es aprovechar los beneficios del paralelismo. Escribir código paralelo en un lenguaje de paradigma funcional es muy fácil.
Para algunas personas, los orígenes matemáticos de la programación funcional hacen que este paradigma sea más fácil de entender que la orientación a objetos. Se basan en el concepto matemático de funciones, siempre que se llamen con el mismo parámetro, el resultado será el mismo, sin que cambie nada en el universo del programa. Por supuesto, esto no es exclusivo de la programación funcional, ya que podemos lograr el mismo resultado en otros paradigmas, pero la programación funcional lo ayudará a pensar siempre en la construcción de obras sin efectos secundarios y estandariza el razonamiento funcional fácilmente en todas las bibliotecas.
NOTE: Algunas recomendaciones acerca de programación funcional (Ingles):
- A beginner friendly intro to functional programming
- So You Want to be a Functional Programmer
- An Introduction to the basic principles of Functional Programming
Que necesito para programar en Clojure?
Para programar en clojure los requisitos son simples:
- Maquina virtual de Java JDK versión 11 (OpenJDK en la mayoría de los sistemas GNU/Linux)
- Leiningen (puede encontrar las instrucciones de instalación en http://leiningen.org/ )
Nota: En un próximo tutorial explicare detalladamente el proceso de instalación de Clojure.
Hola mundo!
Para comenzar a trabajar en Clojure una sigla que sera común en todo momento es REPL (un acrónimo para read, evaluate, print e loop) el cual es un interprete de los comandos que le iremos pasando. Se usted ya programa en Ruby, tal vez ya haya trabajado con irb o pry. Python también ofrece una herramienta para el mismo propósito. Scala e Erlang son ejemplos de lenguajes que también ofrecen tales herramientas.
El primer paso seria abrir una consola y escribir
lein repl
Un terminal interactivo debe aparecer para usted, con un mensaje más o menos así:
nREPL server started on port 59100 on host 127.0.0.1 - nrepl://127.0.0.1:59100
En este punto nuestra consola esta esperando que usted escriba alguna información:
user=>
Esto significa que ya podemos escribir código! Prueba teclear lo siguiente:
“Hola mundo!»
Presionando la tecla Enter (no olvide los “ ”)pasamos la instrucción al interprete y el va a retornar:
Hola mundo!
No se ha ustedes, pero me parece a mi el modo mas simple que existe pare escribir el tan famoso “Hola mundo” de cualquier lenguaje de programación (tal vez la primera vez demore un poco en la ejecución de Leiningen, pues necesitara descargar algunas dependencias para comenzar).
Operaciones básicas
Si llego hasta aquí entonces por que no probar un par de operaciones mas dentro de nuestro interprete REPL?
Vamos a ver algunas operaciones aritméticas de Clojure para entender un poco mas la sintaxis del mismo. No REPL, escriba las siguiente operación:
(+ 2 3)
El resultado como seguramente ya vio fue 5 pero la sintaxis parece bien diferente a todo lo que conocemos en otros lenguajes.
El resultado, como probablemente ya viste, fue 5, pero la sintaxis parece muy diferente de todo lo que conocemos en otros lenguajes. Si bien esto parece una locura, es un bug, no una característica ;).
Esta linea parece una lista (guarde este concepto en su memoria que en otro momento lo retomaremos), compuesta de + , 1 e 2, y es eso mismo; pero vamos por parte:
+ ==> Función (operador de suma)
2 ==> 1er Argumento
3 ==> 2do Argumento
todo esto dentro de paréntesis.
Sucede que el primer elemento de esta lista es especial. Este elemento es una función que es ejecutada, y los demás elementos de esta lista son argumentos para esta función.
Lo mismo podemos encontrar en otras operaciones aritméticas simples y complejas:
(* 2 8)
;; Resultado 16
(- 6 3)
;; Resultado 3
Algo un poco mas complejo:
(- (* 10 9) 10)
;; Resultado 80
Aquí ya seria importante introducir dos conceptos:
- En clojure para introducir comentarios al código usamos dos punto y comas seguidos de este modo ;; Todo lo que este detrás de esta doble puntuación sera ignorado por el interprete. Por ejemplo
;; Ya sabemos realizar operaciones aritméticas en Clojure
- Las operaciones en clojure siempre van de adentro hacia afuera en el mismo orden de los argumentos y respetando los paréntesis. Por ejemplo:
(- 10 (* 10 9))
;; Resultado -80
– ==> Función (operador de resta)
10 ==> 1er Argumento
( 10 9)* ==> 2do Argumento compuesto por la multiplicación de 10 x 9
- Primero realizamos la multiplicación 10 * 9 = 90
- Posteriormente se realiza la resta 10 – 90 = -80
Este ejemplo es donde Clojure muestra otra diferencia en el sentido de sintaxis. Desde el punto de vista de precedencia, está claro que la suma se realizará primero. El diferencial, sin embargo, es que el lenguaje requiere paréntesis, que no deja lugar a dudas sobre qué precede a qué, por lo tanto, el orden de ejecución del código es siempre desde adentro hacia fuera.
NOTA: En realidad, las expresiones en cualquier idioma se evalúan de esa manera. Si escribe (10 – (10 * 9)) en Python, también evaluará de adentro hacia afuera. Es la naturaleza de las expresiones de composición lo que tiene este carácter de adentro hacia afuera.
Esta aquí espero que hayan quedado claro algunos conceptos básicos de Clojure.
Cerrando nuestro interprete
Para cerrar nuestro interprete REPL solo sera necesario presionar
exit
o
quit
También es posible salir con la combinación de teclas Ctrl + d.
Para finalizar
Espero les haya sido interesante este primer tutorial de varios que pienso publicar. Planeo publicar más tutoriales mientras estoy aprendiendo Clojure. En la próxima publicación describiré mi experiencia instalando Leiningen .
De los lenguajes funcionales, mi favorito es Elixir, funciona sobre la VM BEAM de Erlang y cuenta con características muy interesantes como su sintaxis muy similar a Ruby (Directamente se inspira de este lenguaje); su shell interactiva `iex`; `mix` que es la herramienta que nos permite desde descargar dependencias hasta compilar nuestras aplicaiones. También hereda todas las características de Erlang y todos sus módulos, por lo que puede utilizar todas las funciones de OTP, el modelo de supervisores,el soporte para la creación de aplicaciones concurrentes y tolerancia a fallos.
Como parte negativa es que para descargar paquetes de Hex (como PyPI en Python) es necesario utilizar VPN pues se encuentra bloqueado para nuestro país y que es lento para cosas que requieran un uso intensivo de CPU: Procesamiento de imágnes, caálculos complejos entre otros, aunque siempre se puede hacer uso de un FFI en C.
El Hola Mundo sería así: `IO.puts(«Hola Mundo!»)`
Aritmética: `5 + 2 #=> 7`
Funciones:
`defmodule geometria do
def area_rectangulo(a, b) do
a*b
end
end`
Moreno, dile a Maikel que ative el witget de buscar en gutl, que no aparece.
Interesante el articulo.
**Clojure** se ha convertido en uno de los lenguajes mejor pagos en muchos países. En parte por ser un lenguaje no tan popular como **python** **ruby** **java** etc. esto hace que la demanda supere la oferta.
Tengo curiosidad por los frameworks e IDEs que mejor se ajustan a **Clojure**. He visto que muchos usan **emacs** (por Lisp) como entorno de desarrollo, pero a la complejidad del lenguaje ya le estaríamos agregando otra.
Saludos.
Hola Percaff_TI99
Siempre me han recomendado Emacs la versatilidad de esta herramienta, pero reconozco que la curva de aprendizaje es muy alta, especialmente si están lidiando también con el aprendizaje de un nuevo paradigma de programación.
Yo encontré en Sublime Text(herramienta NO LIBRE) una solución simple y elegante. Consigo escribir mi código con resaltados de sintaxis y ejecutar una consola REPL sin grandes contratiempos.
Saludos
Si, Sublime Text es una opción viable y liviana. Incluso he visto que programan en Clojure con la versión 2, por lo que la 3 debería ser mucho mejor.
A mi me gustaba Visual Studio Code, pero dejé de usarlo para ahorrar recursos de máquina. Si te interesa probarlo, hay una extensión «Calva» bastante interesante. Entre muchas cosas puedes evaluar una operación o función en el mismo código. Algo similar a Emacs, salvando las distancias.