RutaCubano

A cuban around the globe

[Clojure] Usted conoce Clojure y la programacion funcional?

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):

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:

  1. 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 
  1. 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.

Leave a Reply

Your email address will not be published. Required fields are marked *.

*
*
You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>